gpt4 book ai didi

c# - ASP.Net MVC 3 登录和 Windows 身份验证

转载 作者:太空狗 更新时间:2023-10-29 17:37:09 25 4
gpt4 key购买 nike

我正在开发一个 ASP.Net MVC 3 应用程序,我有一个存储用户名及其密码的用户表。我创建了一个额外的 ADUsername(存储 Active Directory 的域/用户名)。

我正在尝试执行以下操作:

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

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

    <

这使用 Visual Studio Development Server 非常容易,而使用 IIS 则非常困难:)

当我将我的 Web.Config 设置为使用表单时,我正在使用 WindowsIdentity.GetCurrent().Name 来获取当前的 ADUsername,然后我查找我的用户表以找到用户和 FormsAuthentication.SetAuthCookie。

使用 IIS 总是返回 APPPOOL\ASP.NET v4.0 用户,这不反射(reflect)我需要的域/用户。

有什么帮助吗?

最佳答案

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

此机制的问题是您的 Forms 身份验证将不再被使用,因为它在 Windows 身份验证运行后启动,并且身份验证失败只会触发 IIS 访问被拒绝 - 而不是回退到 Forms 身份验证。

要构建混合动力车,您需要:

  1. 设置您的主 Web 应用程序以使用 Forms 身份验证对用户进行身份验证。像这样设置 web.config。生成您自己的机器 key - 这是确保 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. 创建一个新的、单独的网络应用程序,纯粹用于 NTLM 身份验证。它将授权然后重定向到主应用程序。抱歉,这两个应用无法合并。

  3. 在 NTLM 网络应用程序中,更改 web.config 身份验证模式,如下所示:

    <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>
  1. 在 NTLM webapp 中, Controller 做一件事 - 从 (WindowsPrincipal)Thread.CurrentPrincipal(); 中提取用户名;并调用 FormsAuthentication.SetAuthCookie(..)。然后重定向到主网络应用程序。不要使用 WindowsIdentity.GetCurrent(),因为如果不启用模拟,它将不准确 [请参阅 msdn.microsoft.com/en-us/library/ff647076.aspx],您不想使用它

  2. 您不能在 Cassini 或 IIS Express 下测试这些;您必须使用 IIS 7.5。

  3. 转到 IIS 7.5 并为“身份验证 - 匿名”和“身份验证 - Windows”启用功能委派。

  4. 为基于表单的应用程序创建 IIS 应用程序

  5. 右键单击您新创建的 Forms 应用程序并选择“添加应用程序”。设置您的 NTLM 身份验证应用程序的路径,并将名称设置为类似“IntranetAuthentication”的名称

  6. 在浏览器中访问http://localhost/YourSite用于表单例份验证,以及 http://localhost/YourSite/IntranetAuthentication查看 NTLM 身份验证然后通过身份验证返回主站点

在您的公司,引导 Intranet 用户使用 Intranet 登录。在外部,每个人都使用常规表单例份验证页面。

关于c# - ASP.Net MVC 3 登录和 Windows 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8396813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com