我们有一个在.NET 4.5.2上运行的ASP.NET MVC应用程序,该应用程序在Windows 10或Server 10或Server 2012R2上托管。
如何让用户使用其Windows帐户(使用Windows Authentication模式(登录并模仿它们,以便将服务帐户(在应用程序池中配置(传递到WCF服务,而不是原始用户,用于Back-结束身份验证/授权?
一段时间后,我设法遇到了一个可行的答案和解决方案。
最初,IIS似乎只能将一个用户传递给应用程序。如果打开MVC应用程序的配置编辑器并打开system.webServer/serverRuntime
节,则会看到authenticatedUserOverride
具有UseAuthenticatedUser
和UserWorkerProcessUser
。这将确定哪个用户已发送到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仍显示了登录用户的登录。