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

2024-01-05

我正在开发 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 用户,这不反映我需要的域/用户。

有帮助吗?


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

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

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

  1. 设置您的主 Web 应用程序以使用表单身份验证对用户进行身份验证。像这样设置 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 Web 应用程序中,更改 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 中,控制器做了一件事 - 从 (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. 右键单击新创建的表单应用程序并选择“添加应用程序”。设置 NTLM 身份验证应用程序的路径,并将名称设置为“Intranet 身份验证”之类的名称

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net MVC 3 登录和 Windows 身份验证 的相关文章

随机推荐

  • 将弹出窗口移出屏幕会意外关闭弹出窗口(带有 leaflet.markercluster 的传单)

    我不明白为什么 但每次我打开弹出窗口并且弹出窗口比屏幕大或者我将其锚点移出屏幕时 弹出窗口都会关闭 我现在测试了它 当它发生时leaflet markercluster正在播放 运行这个片段看看我的意思 与传单 markercluster
  • 将字符串转换为 JavaScript 中嵌套对象的属性

    我正在尝试访问一个字符串 key1 key2 作为对象的属性 例如 var obj key1 key2 value1 key3 value2 var attr string key1 key2 变量attr string是嵌套对象中的一串属
  • 具有相同名称和方括号的 jQuery 输入

    我有一个使用 jQuery 和 Ajax 来发布表单数据的表单 但无法让它发送具有相同名称和方括号的输入值 输入看起来像这样并且将具有不同的值
  • 从依赖表中删除数据

    SQL Server 2008 中是否有一个查询会删除所有依赖表中的数据以及所选表中的数据 我很抱歉没有详细说明这个问题 我知道级联删除可以正常工作 但我的应用程序连接到第 3 方 SQL Server 数据库 我有一些单元测试插入到目标表
  • SQL Server 标识规范不连续

    我注意到 SQL Server 2008 Express 在插入自动递增标识规范时会随机向前跳转 例如 我的其中一列 HitStat ID 将依次插入 15 16 17 18 然后突然间 它将决定跳转到 例如 1012 1013 1014
  • Typescript 与 Polymer 1.0?

    我发现这篇很棒的文章我一直在使用 Polymer 0 5 http www mikecann co uk programming tinkering with google polymer and typescript http www m
  • Firefox 中的预加载图像不会在同一页面加载时从缓存中检索

    在某些情况下 我正在网站的主页上运行脚本来交换计时器上的背景图像 我们认为最好尝试实现图像预加载 这会在 Firefox 中提示以下问题 在首页加载时预加载图像不会阻止浏览器再次从原始源而不是缓存加载图像 但奇怪的是 刷新页面会成功地从缓存
  • 如何使用 Flask 和 Flask-login 传递“下一个”URL?

    的文档Flask 登录 https flask login readthedocs org en latest 谈论处理 下一个 URL 这个想法似乎是 用户前往 secret 用户被重定向到登录页面 例如 login 登录成功后 用户将被
  • 将 UIWebView 限制为特定 URL (Swift)

    我正在尝试开发一款 iOS 应用程序 该应用程序在 Swift 中具有 UIWebView 但是我需要它仅适用于一个域 并且在该 UIWebView 中单击的任何外部链接都将在 Safari 中打开 例如 所有链接http example
  • 延迟初始化和 deinit

    我想知道是否有可能在我的视图控制器中使用惰性属性并在deinit方法仅在初始化时才调用我的惰性属性的方法 下面是一些代码 fileprivate lazy var session MySession let session MySessio
  • Rails 4 - 具有简单形式的依赖字段的 JS

    我正在尝试在 Rails 4 中制作一个应用程序 我正在使用简单的表单作为表单 并且刚刚尝试使用 gem dependent fields rails 来隐藏或显示基于主要问题的表单字段的子集问题 我被卡住了 我已将 gem 添加到我的 g
  • Javascript 与 Firefox insideText 问题[重复]

    这个问题在这里已经有答案了 function OpenWindow anchor var toUsername anchor innerText window open ChatWindow aspx username toUsername
  • Objective c - 处理自定义 UITableViewCell 按钮的按钮触摸事件的最佳实践

    处理自定义按钮的按钮触摸事件的最佳实践是什么UITableViewCell 我的课程 MyViewController MyCustomCell 我可以想到三个选择 第一个选项 将按钮作为属性MyCustomCell 然后在其中添加一个目标
  • 如何将字典附加到 pandas 数据框?

    我有一组包含 json 文件的 url 和一个空的 pandas 数据框 其中的列表示 jsnon 文件的属性 并非所有 json 文件都具有 pandas 数据框中的所有属性 我需要做的是从 json 文件创建字典 然后将每个字典作为新行
  • 将 FFmpeg 与 Android-NDK 结合使用

    我想用FFmpeg with Android NDK我在这方面非常基础 我需要一些帮助 我之前在网上研究过这个主题 但没有得到令人满意的解决方案 1 我如何使用FFmpeg通过 Windows 操作系统 我不想使用Ubuntu 请不要建议
  • 允许在url重写中使用中文字符

    我写了 URL 重写规则
  • 在 GDB 中搜索源目录

    如何告诉 nix 中的 GDB 在单个目录中递归搜索源文件 例如 如果一个模块中有一些不同的构建块 a 是 b c d 的父目录 其中 b c d 是子目录 源文件分布在b c b中 我需要向 GDB 指定所有源文件都位于 a 父目录 中
  • 我应该使用 PhoneGap 而不是增加 Android SDK 吗?

    虽然我对 Java 很熟悉 但我在 Web 开发方面有更多的经验 我希望开始编写简单的 Android 游戏 我是否应该只使用 Javascript HTML 来编写所有内容 而忘记在 Java Android SDK 上进行升级 我想我的
  • AngularJS 单击时更改控制器中的部分内容

    我正在开发一个仪表板应用程序 其中同时显示一组模块 我想向这些模块添加多个 视图 例如 Github 模块的第一个视图是存储库列表 当您单击该模块中的存储库链接时 模块中的该视图将被替换为一个新屏幕 显示有关该存储库的所有详细信息 但是 我
  • ASP.Net MVC 3 登录和 Windows 身份验证

    我正在开发 ASP Net MVC 3 应用程序 并且有一个存储用户名及其密码的用户表 我创建了一个额外的 ADUsername 存储 Active Directory 的域 用户名 我正在尝试执行以下操作 从 Intranet 运行应用程