WCF自定义身份验证:在请求期间模拟Windows帐户

时间:2011-03-03 07:52:07

标签: wcf authentication

对于客户,我需要实现以下方案:

  • 用户帐户存储在数据库中。该列表包含Windows身份验证帐户和SQL Server身份验证帐户。密码不存储在数据库中(对于Windows身份验证帐户,Windows系统用于验证凭据,SQL身份验证帐户由SQL服务器验证)
  • 创建一个WCF服务,用户使用自定义身份验证提供程序进行身份验证,以便能够同时处理Windows和SQL帐户。因此,该服务都提供用户名(域\用户名或用户名)和密码。
  • 已经存在一个自定义API,其中包含一个类,该类封装了对数据库服务器的连接处理。如果是Windows帐户,我会为使用集成安全性的类提供连接字符串。在SQL帐户的情况下,我构建一个包含SQL帐户的用户名和密码的连接字符串。在请求开始时创建类的对象会很方便,并在请求结束时将其处理掉。
  • 要使Windows帐户方案生效,我想在请求期间模拟Windows帐户。

我正在寻找的是一种在一个地方实现模仿的方法,而不是分别在每个服务方法中实现。

如何在服务中实现此功能?

感谢您的帮助,

马库斯

2 个答案:

答案 0 :(得分:1)

也许这个例子可以帮助你: 取自here

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
             ("The caller cannot be mapped to a Windows identity.");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            EndpointAddress backendServiceAddress = new EndpointAddress("http://localhost:8000/ChannelApp");
            // Any binding that performs Windows authentication of the client can be used.
            ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>(new NetTcpBinding(), backendServiceAddress);
            IHelloService channel = channelFactory.CreateChannel();
            return channel.Hello(message);
        }
    }
}

答案 1 :(得分:0)

实际上这个链接给出了答案: ServiceAuthorizationBehavior.ImpersonateCallerForAllOperations

一个片段:

有关详细信息,包括在将Allowed与ServiceAuthorizationBehavior.ImpersonateCallerForAllOperations属性一起使用时如何执行模拟,请参阅使用WCF进行委派和模拟以及如何:在服务上模拟客户端。

以下是文字链接。

https://msdn.microsoft.com/en-us/library/system.servicemodel.operationbehaviorattribute.impersonation(v=vs.110).aspx