我有一个使用Windows身份验证的WCF应用程序。因此,我将在System.Threading.Thread.CurrentPrincipal()属性中找到Windows Principal对象。这一切都很好。但是,我还有一个自定义主体对象,用于更精细的授权和审计。这是域用户,而不是Windows用户。我真的需要两者,我正在寻找一个在服务端存储自定义用户的地方,以便在服务上运行的所有代码,通过业务和数据层,可以访问该用户。
客户端和服务器之间的通信由自定义行为和消息检查器处理。从客户端(ASP.NET Web应用程序)调用服务时,它从会话中获取当前用户并将其序列化为服务调用上的自定义标头。在服务端,它然后从标题中剥离主体并将自定义主体放在此处:
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")
所以,验证这种方法的问题是:
感谢您的投入。
答案 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...
}