WCF ServiceSecurityContext存储自定义数据的权限?

WCF ServiceSecurityContext存储自定义数据的权限?,wcf,security,wcf-authentication,Wcf,Security,Wcf Authentication,我有一个使用Windows身份验证的WCF应用程序。因此,我将在System.Threading.Thread.CurrentPrincipal()属性中找到一个Windows主体对象。没关系。但是,我还有一个自定义主体对象,用于更细粒度的授权和审核。这是域用户,不是windows用户。我真的需要这两者,并且正在寻找一个在服务端存储自定义用户的位置,以便在服务上运行的所有代码(通过业务层和数据层)都可以访问该用户 客户端和服务器之间的通信由自定义行为和消息检查器处理。当从客户端(ASP.NET

我有一个使用Windows身份验证的WCF应用程序。因此,我将在System.Threading.Thread.CurrentPrincipal()属性中找到一个Windows主体对象。没关系。但是,我还有一个自定义主体对象,用于更细粒度的授权和审核。这是域用户,不是windows用户。我真的需要这两者,并且正在寻找一个在服务端存储自定义用户的位置,以便在服务上运行的所有代码(通过业务层和数据层)都可以访问该用户

客户端和服务器之间的通信由自定义行为和消息检查器处理。当从客户端(ASP.NET Web应用程序)调用服务时,这将从会话中获取当前用户,并在服务调用中将其序列化为自定义头。在服务端,它将主体从标头中剥离出来,并将自定义主体放在此处:

OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")
因此,验证该方法的问题如下:

  • 这是在服务上存储自定义主体的有效方法。请记住,我希望Windows身份验证保持不变
  • 这是“最佳实践”吗?还是有更好的办法
  • 这种方法有什么陷阱或陷阱需要注意吗

  • 感谢您的输入。

    我无法明确回答这是否是最佳做法,但您可以在传出消息头中传递自定义数据

    public IList<Bill> BillHistory(string accountID, DateTime datefrom, DateTime dateTo)
    {
        string customData = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("customData", "ns");
    ...etc...
    }
    
    下面是一个从客户端调用WCF服务的示例

    MyAccountService.MyAccountServiceClient client = new MyAccountServiceClient();
    using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
    {
        MessageHeader customHeader = MessageHeader.CreateHeader("customData", "ns", "My custom data");
        OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);
    
        List<Bill> list = client.BillHistory("12345", DateTime.Now.AddMonths(-1), DateTime.Now);
    }
    
    MyAccountService.MyAccountServiceClient=new MyAccountServiceClient();
    使用(OperationContextScope范围=新的OperationContextScope(client.InnerChannel))
    {
    MessageHeader customHeader=MessageHeader.CreateHeader(“customData”、“ns”、“我的自定义数据”);
    OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);
    List List=client.BillHistory(“12345”,DateTime.Now.AddMonths(-1),DateTime.Now);
    }
    
    在服务端,您可以检查传入的消息头

    public IList<Bill> BillHistory(string accountID, DateTime datefrom, DateTime dateTo)
    {
        string customData = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("customData", "ns");
    ...etc...
    }
    
    public IList BillHistory(字符串accountID、DateTime datefrom、DateTime dateTo)
    {
    字符串customData=OperationContext.Current.IncomingMessageHeaders.GetHeader(“customData”,“ns”);
    等
    }
    
    Pete:谢谢你的意见。我们使用自定义消息头通过网络发送自定义主体。最棘手的部分是:在服务端将自定义主体存储在哪里?一旦在服务端获得主体,您需要如何处理它?
    MessageHeader customHeader=MessageHeader.CreateHeader(“customData”、“ns”、“我的自定义数据”);OperationContext.Current.OutgoingMessageHeaders.Add(customHeader)这不起作用,因为CurrentContext将为null;在将标题添加到上下文之前添加此行
    OperationContextScope scope=newoperationContextScope(client.InnerChannel)