如何在ASP.NET MVC应用程序中实现以下内容:
-
用户打开内联网网站
如果可能, -
用户将以静默方式进行身份验证
-
如果NTLM身份验证没有成功,请向用户显示登录表单
-
用户指示登录密码,并从预定义域列表中选择域
-
用户使用AD在代码中进行身份验证
我知道如何实现4和5,但无法找到有关如何组合NTLM和表单的信息 . 因此,永远不会显示NTLM本机登录/密码对话框 - 透明身份验证或外观漂亮的登录页面 .
该怎么办?是否应该询问用户登录名和密码?可以使用她当前的凭据(域用户名)而无需输入登录名和密码吗?
UPDATE for these, investigating same problem:
当我问这个时,我并不完全理解NTLM身份验证如何在内部工作 . 这里需要了解的重要一点是,如果用户的浏览器不能正确支持NTLM,或者用户禁用了NTLM支持,那么服务器永远不会有机会解决这个问题 .
Windows身份验证的工作原理:
-
客户端向服务器发送常规HTTP请求
-
服务器以HTTP状态401响应并指示必须使用NTLM身份验证来访问资源
-
客户端发送NTLM Type1消息
-
服务器使用质询响应NTLM Type2消息
-
客户端发送Type3消息以响应challenge
-
服务器响应请求的实际内容
如您所见,不支持NTLM的浏览器不会转到步骤(3),而是会向用户显示IIS生成的错误401页面 .
如果用户没有凭据,则在取消NTLM身份验证后,弹出对话框窗口浏览器也不会继续(3) .
因此,我们没有机会自动将用户重定向到自定义登录页面 .
这里唯一的选择是有一个“网关”页面,我们决定用户是否应该支持NTLM,如果是,请重定向到受NTLM保护的主页 .
如果没有,请显示登录表单并通过手动输入登录名和密码进行身份验证 .
通常通过匹配IP范围或通过检查预定义IP表来基于用户的IP地址和/或主机名做出决定 .
3 回答
本文可能会让您指出正确的方向 . 基本上,在同一主机名下的两个虚拟目录中有两个应用程序 . 一个应用程序使用Forms身份验证,一个使用Windows . 使用Windows身份验证的人创建一个有效的表单身份验证cookie并重定向到第二个虚拟目录 .
ASP.NET Mixed Mode Authentication
我在 生产环境 中有这个确切的设置,我设置我的门户使用FormsAuth并编写了一个函数,使访问者IP查找登录到该IP / PC的用户帐户 . 使用我找到的名称(例如
DOMAIN\user
),我验证域名与我的域匹配,并且用户名/帐户在我的FormsAth提供程序中使用Membership.GetUser(<user>)
有效 . 如果此调用返回匹配项并且用户IsApproved
我为该用户创建了一个FormsAuthenticationTicket
&cookie . 我在网络上有400个人,这个工作完美,唯一仍然登录的计算机是(1 . 我的门户网站没有帐户的用户,2 . 一些MAC / Linux用户,3 . 没有在网络上启动的移动用户有组策略使他们的防火墙变高 .此解决方案的问题是它需要 impersonation of a domain admin account 来查询用户PC,并且您使用非托管代码 netapi32.dll .
这是我使用的代码(为简洁起见,未提供外部函数调用) . 我试图简化这一点,因为有很多外部呼叫 .
现在使用我们在第一个函数/进程中获取的帐户,我们现在尝试验证并确定是否应该显示登录或自动登录用户 .
很久以前我写了一篇关于这个的博客文章,这里是我在帖子Source Code Download中提供的netapi32.dll包装器和我的Impersonation助手的链接
您不能在同一个ASP.NET应用程序中同时具有NTLM和FormsAuthentication . 您将在单独的虚拟目录中需要两个不同的应用程序