如何在ASP.NET MVC网站上使用Windows身份验证,并在后端WCF服务上使用AppPool用户模仿用户



我们有一个在.NET 4.5.2上运行的ASP.NET MVC应用程序,该应用程序在Windows 10或Server 10或Server 2012R2上托管。

如何让用户使用其Windows帐户(使用Windows Authentication模式(登录并模仿它们,以便将服务帐户(在应用程序池中配置(传递到WCF服务,而不是原始用户,用于Back-结束身份验证/授权?

一段时间后,我设法遇到了一个可行的答案和解决方案。

最初,IIS似乎只能将一个用户传递给应用程序。如果打开MVC应用程序的配置编辑器并打开system.webServer/serverRuntime节,则会看到authenticatedUserOverride具有UseAuthenticatedUserUserWorkerProcessUser。这将确定哪个用户已发送到MVC,您将在MVC应用程序中的控制器中找到User.Identity属性下的WindowsIdentity。这是行不通的。

我偶然发现了Microsoft的一篇文章(如何:在Web应用程序中拨打WCF中的原始呼叫者(,这为我提供了导致解决方案的工作的基础。

在文章中,他们提到您需要使用Impersonate()调用,该呼叫看起来像是在客户端使用的类似于此的呼叫:

using (((WindowsIdentity)User.Identity).Impersonate())
{
    var channelFactory = new ChannelFactory<IService1>("*");
    var proxy = channelFactory.CreateChannel();
    return View((object)proxy.GetName("1"));
}

在服务方面,您需要标记您的操作以进行模拟:

[OperationBehavior(Impersonation = ImpersonationOption.Required)]

我还添加了PrincipalPermission,以确保仅服务帐户通过:

[PrincipalPermission(SecurityAction.Demand, Name = "PC-NAME\SvcAccount")]

似乎您需要使用wsHttpBinding绑定。

<wsHttpBinding>
  <binding name="secure">
    <security mode="TransportWithMessageCredential">
      <transport clientCredentialType="Windows" />
    </security>
  </binding>
</wsHttpBinding>

我让它通过SSL工作,它通过自动将凭据传递给WCF服务,但它是原始用户而不是服务帐户,因此我从服务中获得了授权错误。

进一步谷歌搜索后,我发现了这个片段,这给了我一个想法:为当前用户(C#(获得网络限制

我替换了我的客户端代码,看起来这样:

using (System.Security.Principal.WindowsIdentity.GetCurrent().Impersonate())
{
    var channelFactory = new ChannelFactory<IService1>("*");
    var proxy = channelFactory.CreateChannel();
    return View((object)proxy.GetName("1"));
}

然后瞧瞧!有效!服务授权用户(我更改了属性中的名称只是为了确保我没有做梦(并返回一个值,并且前端UI仍显示了登录用户的登录。

最新更新