2011-12-06 54 views
9

我正在一个ASP.Net MVC 3应用程序,我有一个用户表,用于存储用户名和密码。我创建了一个额外的ADUsername(存储Active Directory的域名/用户名)。ASP.Net MVC 3登录和Windows身份验证

我努力做到以下几点:

  1. 运行从内联网应用,用户不应该看到的登录页面。他们的域名/用户名应自动接收并与ADUsername字段进行比较。

  2. 从互联网(超出本地网络)或没有ADUsername值的用户运行应用程序的用户:应该看到登录屏幕,他们应该使用我的自定义用户名和密码字段进行登录。

此使用Visual Studio开发服务器和很难使用IIS :)

当我把我的web.config中使用的形式,我使用WindowsIdentity.GetCurrent()是很容易的。名称得到当前的ADUsername然后,我查找我的User表以找到用户和FormsAuthentication.SetAuthCookie他。

使用IIS总是返回APPPOOL \ ASP.NET v4.0用户,它不反映我需要的域/用户。

任何帮助?

+0

还在等一些帮助。如上所述,我需要Forms和Windows身份验证才能一起工作。 – IoC

回答

15

这不是一件容易的事。只有当启用了IIS中的Windows身份验证时,您的Intranet用户的Windows身份才会可用,并禁用匿名身份验证。当用户的浏览器击中服务器时,IIS将执行NTLM质询/响应过程来验证用户。请注意,这个质询/响应实际上发生在每个单独的HTTP请求上,而不仅仅是一次。

此机制的问题在于您的表单身份验证将不再使用,因为它在Windows身份验证运行后启用,并且未通过身份验证仅触发IIS访问被拒绝 - 不回退到Forms身份验证。

要构建一个混合体,你将需要:

  1. 设置您的主要的Web应用程序进行身份验证与Forms身份验证的用户。像这样设置web.config。生成你自己的机器的关键 - 这是关键,以确保cookie的共享工作

    <authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" path="/" enableCrossAppRedirects="true" name=".ASPXFORMSAUTH" protection="All" /> 
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> <system.webServer> 
    <security> 
        <authentication> 
        <anonymousAuthentication enabled="true"/> 
        <windowsAuthentication enabled="false"/> 
        </authentication> 
    </security></system.webServer> 
    
  2. 创建一个新的,独立的Web应用程序,以纯粹使用NTLM身份验证。它将授权然后重定向到主应用程序。对不起,这两个应用程序不能合并。

  3. 在NTLM网络应用程序中,更改网页。配置验证模式象下面这样:

<authentication mode="Windows">  
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
       decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> 
<system.webServer> 
    .... 
    <security> 
     <authentication> 
     <windowsAuthentication enabled="true"/> 
     <anonymousAuthentication enabled="false"/> 
     </authentication> 
     <ipSecurity> 
     <!-- put whatever here to restrict to your LAN 
     <add ..../> 
     --> 
     </ipSecurity> 
    </security> 
    </system.webServer> 
  • 在NTLM的web应用时,控制器也一两件事 - 从提取的用户名(WindowsPrincipal)Thread.CurrentPrincipal中();并调用FormsAuthentication.SetAuthCookie(..)。然后重定向到主Web应用程序。不要使用WindowsIdentity.GetCurrent(),因为如果未启用模拟,它将不准确[请参阅msdn.microsoft.com/en-us/library/ff647076.aspx]

  • 您无法在卡西尼或IIS Express下测试此任何内容;您必须使用IIS 7.5。

  • 转到IIS 7.5并打开“身份验证 - 匿名”和“身份验证 - Windows”的功能委派。

  • 为您的基于表单的应用

  • IIS应用程序右键单击新创建的窗体应用程序和“添加应用”。设置路径的NTLM身份验证的应用程序,名称类似“IntranetAuthentication”

  • 在窗体身份验证的浏览器访问http://localhost/YourSite,并http://localhost/YourSite/IntranetAuthentication看到NTLM身份验证,然后中继身份验证工作回主站点

  • 在您的公司,直接内部网用户使用Intranet登录。外部每个人都使用常规表单认证页面。

    +0

    我需要非常小的样本。你可以帮我吗? – IoC

    +0

    在这里发布解决方案涉及太多,我已经在这里为您提供了一个工作示例https://bitbucket.org/geoffreys/so-dual-win-forms-auth/ – geoffreys

    +0

    该死的刚刚注意到只有一半的解决方案承诺。对不起将提交休息明天 - 他们应该得到你在正确的轨道 – geoffreys

    3

    如果您使用混合身份验证,为什么不通过上下文获取AD用户?

    context.Request.ServerVariables["LOGON_USER"] 
    
    +0

    不返回任何值! – IoC

    +0

    我相信IIS配置有问题。请确保在您的网站上关闭匿名身份验证,并打开Windows身份验证,如果您想拥有AD身份验证。 –