首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中支持NTLM身份验证和回退到表单?

如何在ASP.NET MVC中支持NTLM身份验证和回退到表单?
EN

Stack Overflow用户
提问于 2010-10-27 04:51:47
回答 3查看 15K关注 0票数 21

如何在ASP.NET MVC应用程序中实现以下内容:

  1. 用户打开intranet网站
  2. 用户进行静默身份验证如果可能
  3. 身份验证失败,请向用户显示登录表单
  4. 用户指明登录密码并从预定义的域列表中选择域

H19用户使用AD进行代码身份验证H210G211

我知道如何实现4和5,但找不到有关如何结合NTLM和表单的信息。因此NTLM本机登录/密码对话框永远不会显示-透明身份验证或美观登录页面。

应该如何工作?是否应该询问用户的登录和密码?是否可以在不要求输入登录和密码的情况下使用她的当前凭据(域用户名)?

针对这些的更新,调查相同的问题:

当我问这个问题时,我并不完全了解NTLM身份验证的内部工作原理。这里要理解的重要一点是,如果用户的浏览器不能正确支持NTLM,或者如果NTLM支持被用户禁用-服务器将永远没有机会解决这个问题。

Windows身份验证的工作原理:

  1. 客户端向服务器发送常规超文本传输协议请求
  2. 服务器响应HTTP状态401,并指示必须使用NTLM身份验证才能访问resources
  3. Client发送NTLM Type1消息
  4. 服务器响应NTLM Type2消息,发送Type3消息响应质询
  5. 服务器响应请求的实际内容

如你所见,不支持NTLM的浏览器将不会转到第(3)步,而是会向用户显示IIS生成的错误401页面。

如果用户没有凭据,取消NTLM身份验证后,弹出对话框窗口浏览器将不再继续(3)。

因此我们没有机会自动将用户重定向到自定义登录页面。

这里唯一的选择是有一个“网关”页面,在那里我们决定用户是否应该支持NTLM,如果支持,则重定向到NTLM保护的主页。

如果没有,则显示登录表单,并允许通过手动输入登录名和密码进行身份验证。

通常通过匹配IP范围或检查预定义IP表,根据用户的IP地址和/或主机名做出决定。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-27 10:53:59

这篇文章可能会让你找到正确的方向。基本上,您在同一主机名下的两个虚拟目录中有两个应用程序。一个应用程序使用Forms身份验证,另一个应用程序使用Windows。使用Windows身份验证的服务器将创建有效的表单身份验证cookie,并重定向到第二个虚拟目录。

ASP.NET Mixed Mode Authentication

票数 10
EN

Stack Overflow用户

发布于 2010-10-27 14:39:59

我在生产中进行了完全相同的设置,我将我的门户设置为使用FormsAuth,并编写了一个函数,该函数使用访问者IP来查找登录到该IP / PC的用户帐户。使用我找到的名称(例如,DOMAIN\user),我使用Membership.GetUser(<user>)验证该域是否与我的域匹配,以及用户名/帐户在我的FormsAth提供程序中是否有效。如果此调用返回匹配,并且用户cookie,我将为该用户创建一个FormsAuthenticationTicket & IsApproved。我有400+人员在网络上,这工作得很好,唯一仍然登录的计算机是(1.在我的门户中没有帐户的用户,2.一些MAC/Linux用户,3.没有在网络上启动并将组策略启用他们的防火墙为高的移动用户)。

此解决方案的缺点是,它需要域管理帐户的模拟来查询用户PC,并且您使用非托管代码netapi32.dll。

以下是我使用的代码(为简洁起见,未提供外部函数调用)。我试着简化一下,因为有很多外部调用。

string account = String.Empty;
string domain = String.Empty;
string user = String.Empty;


ImpersonateUser iu = new ImpersonateUser();  //Helper that Enabled Impersonation
if (iu.impersonateValidUser(StringHelper.GetAppSetting("DomainAccount"), StringHelper.GetAppSetting("DomainName"), StringHelper.GetEncryptedAppSetting("DomainAccountPassword")))
{
    NetWorkstationUserEnum nws = new NetWorkstationUserEnum(); //Wrapper for netapi32.dll (Tested on Vista, XP, Win2K, Win2K3, Win2K8)
    string host = nws.DNSLookup(Request.UserHostAddress); // netapi32.dll requires a host name, not an IP address

    string[] users = nws.ScanHost(host); // Gets the users/accounts logged in

    if (nws.ScanHost(host).Length > 0)
    {
        string workstationaccount = string.Empty;

        if (host.IndexOf('.') == -1)  // Pick which account to use, I have 99.9% success with this logic (only time doesn't work is when you run a interactive process as a admin e.g. Run As <process>).
        {
            workstationaccount = String.Format("{0}\\{1}$",StringHelper.GetAppSetting("DomainName"), host).ToUpper();
        }
        else
        {
            workstationaccount = String.Format("{0}\\{1}$", StringHelper.GetAppSetting("DomainName"), host.Substring(0, host.IndexOf('.'))).ToUpperInvariant();
        }

        account = users[users.Length - 1].Equals(workstationaccount) ? users[0] : users[users.Length - 1];

        domain = account.Substring(0, account.IndexOf("\\"));
        user = account.Substring(account.IndexOf("\\") + 1,
                                 account.Length - account.IndexOf("\\") - 1);
    }

    iu.undoImpersonation(); // Disable Impersonation
}

现在,使用我们在第一个函数/过程中获取的帐户,我们现在尝试验证并决定是否应该显示登录或自动登录用户。

MembershipUser membershipUser = Membership.GetUser(user);

if (membershipUser != null && membershipUser.IsApproved)
{
    string userRoles = string.Empty;  // Get all their roles
    FormsAuthenticationUtil.RedirectFromLoginPage(user, userRoles, true); // Create FormsAuthTicket + Cookie + 
}

我很久以前就写过一篇关于这个问题的博客文章,这里有一个指向netapi32.dll的包装器和我在文章Source Code Download中提供的模拟助手的链接

票数 2
EN

Stack Overflow用户

发布于 2010-10-27 14:24:55

不能在同一ASP.NET应用程序中同时使用NTLM和FormsAuthentication。您将需要在单独的虚拟目录中使用两个不同的应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4027911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档