模拟、活动目录和“用户无权使用 xxxx”问题
本文关键字:xxxx 问题 用户 活动 模拟 | 更新日期: 2023-09-27 17:56:55
我有 2 个 ASP.NET MVC 3 应用程序。我正在通过web.config使用模拟来允许我查询Active Directory以获取有关用户的详细信息。该应用程序使用 Windows 身份验证,不允许匿名用户。一个应用程序是用户执行其任务的主要应用程序。另一个允许用户设置其他用户的外观,使其看起来像应用程序 1 中的他们。
测试用户收到以下错误:
SQL1092N "<DOMAIN ID>" does not have the authority to perform the requested command.
这发生在我将 Web 请求从主应用程序发送到辅助应用程序之后。为了使它正常工作,我必须使请求模拟实际用户,而不是应用程序用于模拟的标识。这实际上是我发布并回答的一个 SO 问题。这就是:如何通过WebRequest调用MVC操作并通过Active Directory验证请求?
在该代码的末尾,我调用:
impersonationContext.Undo();
在此 Web 请求发生后,主应用程序尝试访问数据库,现在似乎上述调用已撤消应用程序的模拟,因此用户尝试执行任何打开数据库连接的操作都将失败。至少,这是我经过一天的头部打击后的工作理论。
我的问题是,如何让应用程序的模拟恢复到 web.config 中的用户?或者,在发出 Web 请求时,有没有办法确保模拟上下文仅适用于该请求?
所有这一切的重点是第二个应用程序有自己的SQL服务器数据库。主应用程序使用 DB2。我想编写一次数据库访问代码,但在两个应用程序中都使用它。目前,这就是我所做的,但是我依靠Web请求来获取数据的方法可能不是最佳方法。
我愿意接受任何想法、评论、建议和/或批评。我应该如何处理这个问题?
好的...我的理论是,在发出 Web 请求时更改了 IPrincipal 上下文,事实证明这是准确的,这使得这个修复非常容易。最好的部分是,我可以继续使用我构建的 api 来发出此请求,而无需复制 Sql Server 实体框架部分。
我对我的 api 库有以下调用:
proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
adUserInfo.AssociateId,
context.User);
此代码由授权筛选器属性调用。方法原型如下所示
public void OnAuthorization(AuthorizationContext filterContext)
在内部,该调用使 GetProxies 方法进行以下调用:
public static StreamReader GetWebRequestStream(
string url,
string contentType,
bool useDefaultCredentials,
IPrincipal user)
{
var impersonationContext = ((WindowsIdentity)user.Identity).Impersonate();
var request = WebRequest.Create(url);
try
{
request.ContentType = contentType;
//request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
//request.UseDefaultCredentials = useDefaultCredentials;
//IWebProxy p = new WebProxy();
//request.Proxy = p.
request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
var response = (HttpWebResponse)request.GetResponse();
return new StreamReader(response.GetResponseStream());
}
catch (Exception e)
{
impersonationContext.Undo();
throw e;
}
finally
{
impersonationContext.Undo();
}
}
当调用方法返回时,用户的标识不再是为应用程序设置的标识模拟。修复非常简单:
//Track current identity before proxy call
IPrincipal user = context.User;
proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
adUserInfo.AssociateId,
context.User);
//Undo any impersonating done in the GetProxies call
context.User = user;
2行代码解决了12小时的头部疼痛。情况可能会更糟。无论如何。感谢您成为共鸣板。我试过了与鸭子进行了这种转换,但鸭子感到困惑。