如何在ASP.NET MVC应用程序中实现以下内容:
H19用户使用AD进行代码身份验证H210G211
我知道如何实现4和5,但找不到有关如何结合NTLM和表单的信息。因此NTLM本机登录/密码对话框永远不会显示-透明身份验证或美观登录页面。
应该如何工作?是否应该询问用户的登录和密码?是否可以在不要求输入登录和密码的情况下使用她的当前凭据(域用户名)?
针对这些的更新,调查相同的问题:
当我问这个问题时,我并不完全了解NTLM身份验证的内部工作原理。这里要理解的重要一点是,如果用户的浏览器不能正确支持NTLM,或者如果NTLM支持被用户禁用-服务器将永远没有机会解决这个问题。
Windows身份验证的工作原理:
如你所见,不支持NTLM的浏览器将不会转到第(3)步,而是会向用户显示IIS生成的错误401页面。
如果用户没有凭据,取消NTLM身份验证后,弹出对话框窗口浏览器将不再继续(3)。
因此我们没有机会自动将用户重定向到自定义登录页面。
这里唯一的选择是有一个“网关”页面,在那里我们决定用户是否应该支持NTLM,如果支持,则重定向到NTLM保护的主页。
如果没有,则显示登录表单,并允许通过手动输入登录名和密码进行身份验证。
通常通过匹配IP范围或检查预定义IP表,根据用户的IP地址和/或主机名做出决定。
发布于 2010-10-27 10:53:59
这篇文章可能会让你找到正确的方向。基本上,您在同一主机名下的两个虚拟目录中有两个应用程序。一个应用程序使用Forms身份验证,另一个应用程序使用Windows。使用Windows身份验证的服务器将创建有效的表单身份验证cookie,并重定向到第二个虚拟目录。
发布于 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中提供的模拟助手的链接
发布于 2010-10-27 14:24:55
不能在同一ASP.NET应用程序中同时使用NTLM和FormsAuthentication。您将需要在单独的虚拟目录中使用两个不同的应用程序。
https://stackoverflow.com/questions/4027911
复制相似问题