3

背景:

我有一个连接外部 API 的 MVC 5/C# 应用程序。它使用Active Directory用户的Principal Context授权。该应用程序检查是否将UserPrincipal.Current其 Un/Pw 组合存储在 Db 中以用于稍后在外部 API 上的任何操作。

 public bool IsUserSetup()
    {
        try
        {
            // find currently logged in user
            var user = UserPrincipal.Current; // <- ERRS HERE -----
            // check if this user exists in Db with creds
            if (user != null)
            {
                var u = _userProfileRepository.GetUserProfileByUserSID(user.Sid.ToString());
                if (u != null
                    && !string.IsNullOrEmpty(u.RallyUsername)
                    && !string.IsNullOrEmpty(u.RallyPassword)
                    && u.IsActive // <-- make sure this person is an active user
                    )
                {
                    return true;
                }
            }
        }
        catch (Exception ex)
        {
            string exMessage = ex.Message;
            //throw ex;
        }
        return false;
    }
  • 我知道UserPrincipal.Current默认情况下会返回 App Pool 的身份。
  • 我也了解将 Impersonate 设置为 True IIS 将使用当前用户的上下文,如下所示: <system.web> <identity impersonate="true"/>...

但是,如果我打开模拟(真),那么我会得到这个:

An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode.

因此,我将其更改app pool为使用“经典”(我认为这不是我应该采取的答案或路径),并且出现此错误:

The page you are requesting cannot be served because of the ISAPI and CGI Restriction list settings on the Web server.

显然,这在 IIS Express 中效果很好,它认为我(域\用户名)很好。但是当我将它切换到 IIS 或将其部署到实际的 Web 服务器时,我遇到了这些问题。

我需要获取当前用户/主体,以便我可以将他们的 SID 和凭据存储到 Db 中的外部 API。然后在使用站点/应用程序时,它会自动神奇地使用他们的信用在 API 中根据需要进行工作。

我需要做什么:

  • 设置 IIS 以允许模拟工作
  • 调整我的代码做同样的事情
4

1 回答 1

1

这里,使用选项 2,即:

<system.webServer>
   <!--When using 'Integrated Pipeline' on IIS on the server, and if your application does not rely on impersonating the requesting user in the 'BeginRequest' and 'AuthenticateRequest' stages (the only stages where impersonation is not possible in Integrated mode), but still requires Impersonation in other areas of the application, ignore this error (500 - Internal Server Error) by adding the following to your application’s web.config-->
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
于 2016-01-19T15:57:14.440 回答