背景:
我有一个连接外部 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 以允许模拟工作
- 调整我的代码做同样的事情