【问题标题】:How to integrate an ASP.Net intranet with Active Directory?如何将 ASP.Net 内部网与 Active Directory 集成?
【发布时间】:2020-02-24 17:23:09
【问题描述】:

我目前正在为我的公司开发一个 Intranet 门户,它将保留在内部,只有在我们域中拥有帐户的用户才能访问它。目前,我使用表单身份验证方法,并使用System.DirectoryServices 针对 Active Directory 域对用户进行身份验证。我还使用System.DirectoryServices.AccountManagement 询问 AD,以根据用户所属的 Active Directory 组管理访问权限,并将一些数据存储在用户会话中,一切正常。

我被要求研究是否可以在我们的上下文中实施单点登录,我们所有的用户都在 RDS 中工作,无一例外,所以他们始终处于经过身份验证的会话中,而上级更愿意不必签名在所有。至于重写代码以验证和授权用户,如herehere 所述 我不太担心。

我在一个空白的 ASP.Net MVC5 项目上尝试了所有方法,并在其中添加了一个具有集成安全性的 ADO.Net 模型。我的开发 SQL Server 托管在远程服务器(不是开发桌面)上,同一台服务器还托管开发 IIS 服务器。在生产中,这两个服务都将位于不同的服务器上。只要我在桌面上进行本地调试,它就可以正常工作,但是一旦我发布到 IIS 服务器,我遇到了第一个障碍,无法摆脱它。

当我更改 IIS 应用程序中的设置以禁用匿名并启用 Windows 身份验证时,IIS 自动将 web.config 文件 (as suggested here) 中的 <authentication mode="Forms" /> 更改为 <authentication mode="Windows" />,但我无法使其与Integrated Security=TrueIntegrated Security=SSPI,我收到一个错误页面,上面写着 [SqlException (0x80131904): Login failed for user 'DOMAIN\MACHINE$'.]

连接字符串如下:<add name="ASPNetProjectEntities" connectionString="metadata=res://*/Models.ModelASPNetProject.csdl|res://*/Models.ModelASPNetProject.ssdl|res://*/Models.ModelASPNetProject.msl;provider=System.Data.SqlClient;provider connection string="data source=MACHINE;initial catalog=DATABASE;persist security info=True;Integrated Security=SSPI;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />

我尝试将机器帐户 DOMAIN\MACHINE$ 添加到 SQL 登录并授予它对数据库的权限,但没有骰子。我尝试在服务器 AD 帐户中授权委派并激活身份模拟,但这也不起作用。如果我在连接字符串中放入一个 SQL 用户/密码,我只能让它在远程 IIS 服务器上工作。

所以我不知道这里可能缺少什么使其与集成安全性一起使用。还是我必须将 SQL 凭据放入连接字符串并在 IIS 上对其进行加密?

【问题讨论】:

    标签: asp.net sql-server iis


    【解决方案1】:

    您将集成安全性与您网站的身份验证机制混淆了。如果您使用集成安全性,则从您的 Web 应用程序到 SQL Server 的连接将使用您的 Web 应用程序正在运行的应用程序池所使用的帐户。要使用集成安全性,请在 AD 中创建一个服务帐户,将您的应用程序池设置为作为该帐户运行,并在 SQL Server 中向该服务帐户授予必要的权限。

    请注意,您使用的是表单身份验证还是集成安全性与 Web 应用程序连接到 SQL Server 的方式无关,除非您使用的是模拟,而您不应该使用它。

    【讨论】:

    • 为什么,是的,这确实解决了 Web 应用程序尝试连接到 SQL 服务器的问题,但它确实引入了另一个问题。当发布到 IIS 服务器时,整个代码在服务帐户下运行,System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString() 返回该服务帐户用户名,而不是最终用户用户名。
    • @Eric 当然,那是因为你使用了错误的东西来获取当前用户的用户名。您描述的该方法用于获取应用程序正在运行的帐户,而不是访问该应用程序的用户的帐户。根据您所处的上下文,有几种方法可以获取它。在 MVC 控制器中,您可以通过User.Identity.Name 获取它,因为User 是控制器实例的属性。
    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2020-09-08
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多