【发布时间】:2013-05-05 17:05:38
【问题描述】:
我正在使用Microsoft.IdentityModel.dll 设置并获取WCF 中的声明。我还实施了MessageInspectors 来设置索赔。所以,我从客户端添加ClaimsIdentity 用于请求标头,如下所示。
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
var claims = new List<Claim> { new Claim(UserIdClaim, "12345"), };
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims);
MessageHeader<ClaimsIdentity> header = new MessageHeader<ClaimsIdentity>(claimsIdentity);
var untypedHeader = header.GetUntypedHeader(ClaimsName, ClaimsNameSpace);
request.Headers.Add(untypedHeader);
return null;
}
还有服务端,
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
ClaimsIdentity claimsIdentity = request.Headers.GetHeader<ClaimsIdentity>(ClaimsName, ClaimsNameSpace);
var claimsIdentitylst = new ClaimsIdentityCollection(new List<IClaimsIdentity> { claimsIdentity });
IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentitylst);
Thread.CurrentPrincipal = claimsPrincipal;
return null;
}
我正在尝试访问在AfterReceiveRequest 中设置的方法实现(OperationContract)中的声明值,如下所示。但是Thread.CurrentPrincipal 中没有声明。
var userIdClaim = ((IClaimsIdentity)Thread.CurrentPrincipal.Identity).Claims.First(c => c.ClaimType == UserIdClaim);
userIdClaim 在这里为空。
有什么想法吗?
【问题讨论】:
-
AfterReceiveRequest 内的 Thread.CurrentPrincipal 中的调试是否显示声明?
-
@DanilaPolevshikov,它有。
标签: wcf wif endpoint idispatchmessageinspector iclientmessageinspector