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

时间:2009-10-15 15:45:14

标签: wcf security wcf-authentication

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

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

OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")

所以,验证这种方法的问题是:

  1. 这是在服务上存储自定义主体的有效方法吗?请记住,我希望Windows身份验证保持不变。
  2. 这是“最佳做法”吗?或者有更好的方法吗?
  3. 使用这种方法需要注意的任何陷阱或陷阱?
  4. 感谢您的投入。

1 个答案:

答案 0 :(得分:2)

如果这是最佳做法,我无法具体回答,但您可以在外发邮件标题中传递自定义数据。

以下是从客户端调用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);
}

在服务端,您可以检查传入的邮件标题。

public IList<Bill> BillHistory(string accountID, DateTime datefrom, DateTime dateTo)
{
    string customData = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("customData", "ns");
...etc...
}
相关问题