繁体   English   中英

双跳 IIS 到 SQL 服务器身份验证在本地工作,不能在远程工作

[英]Double hop IIS to SQL Server authentication works locally, doesn't work remotely

关于双跳认证浏览器的问题 -> IIS (ASP.NET WebForms app) -> SQL 服务器。

我有一个带有 Web.config 的 WebForms 网站,如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <sectionGroup name="devExpress">
          ...some DevExpress settings here...
        </sectionGroup>
      </configSections>
      <connectionStrings>
        <add name="ConnStringName" connectionString="Data Source=SERVER_NAME;Initial Catalog=DB_NAME;Trusted_Connection=Yes;Integrated Security=SSPI;Persist Security Info=False;Connect Timeout=0" providerName="System.Data.SqlClient" />
      </connectionStrings>
      <system.web>
        <identity impersonate="true" />
        ...
        <authentication mode="Windows" />
        <authorization>
          <deny users="?" />
        </authorization>
        ...
        <httpRuntime maxRequestLength="4096" requestValidationMode="4.0" executionTimeout="110" targetFramework="4.5.2" />
        <pages validateRequest="true" clientIDMode="Predictable">
        ...
        </pages>
        <sessionState mode="InProc" timeout="60"></sessionState>
      </system.web>
      <system.webServer>
        <defaultDocument>
          <files>
            <clear />
            <add value="Default.aspx" />
          </files>
        </defaultDocument>
        ...
        <validation validateIntegratedModeConfiguration="false" />
      ...
    </configuration>

I need it to work like this: when any user in domain opens site in browser, ASP.NET Web Forms application runs under his Windows credential. 然后必须使用相同的凭据来验证 ASP.NET 应用程序使用 SqlConnection class 进行的数据库调用。

为清楚起见: SQL 服务器配置为使用 Windows 身份验证。 必须有权访问应用程序和数据库的用户包含在特定的 AD 组中。 该组列在 DB 的 Security - Logins 列表中,具有 data_reader、data_writer 权限(并且它们还可以执行存储的过程)。

最有趣的是它如何工作的:
#1。 当我在打开 IIS 的服务器上打开浏览器时,输入 http://localhost:port/ - 它按预期工作。
#2。 当我在 PC 上打开浏览器时,键入 http://server-name:port/ - 它会捕获 SqlConnection 打开错误:

System.Data.SqlClient.SqlException
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

在这两种情况下,Context.User.Identity.Name 和 WindowsIdentity.GetCurrent().Name 都是正确的。

为什么这两种情况会给出不同的结果? 如何使#2 像#1 一样工作?

由于这是一个双跳身份验证方案,您必须启用Kerberos 约束委派 参见例如在 IIS 中为网站设置 Kerberos 身份验证

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM