WCF ServiceSecurityContext存储自定义数据的权限?
我有一个使用Windows身份验证的WCF应用程序。因此,我将在System.Threading.Thread.CurrentPrincipal()属性中找到一个Windows主体对象。没关系。但是,我还有一个自定义主体对象,用于更细粒度的授权和审核。这是域用户,不是windows用户。我真的需要这两者,并且正在寻找一个在服务端存储自定义用户的位置,以便在服务上运行的所有代码(通过业务层和数据层)都可以访问该用户 客户端和服务器之间的通信由自定义行为和消息检查器处理。当从客户端(ASP.NET Web应用程序)调用服务时,这将从会话中获取当前用户,并在服务调用中将其序列化为自定义头。在服务端,它将主体从标头中剥离出来,并将自定义主体放在此处:WCF ServiceSecurityContext存储自定义数据的权限?,wcf,security,wcf-authentication,Wcf,Security,Wcf Authentication,我有一个使用Windows身份验证的WCF应用程序。因此,我将在System.Threading.Thread.CurrentPrincipal()属性中找到一个Windows主体对象。没关系。但是,我还有一个自定义主体对象,用于更细粒度的授权和审核。这是域用户,不是windows用户。我真的需要这两者,并且正在寻找一个在服务端存储自定义用户的位置,以便在服务上运行的所有代码(通过业务层和数据层)都可以访问该用户 客户端和服务器之间的通信由自定义行为和消息检查器处理。当从客户端(ASP.NET
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")
因此,验证该方法的问题如下:
感谢您的输入。我无法明确回答这是否是最佳做法,但您可以在传出消息头中传递自定义数据
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)代码>