我想从WCF服务访问添加到UI层中当前主体的自定义声明。 我有一个Web应用程序,一旦用户通过STS验证,就会向CurrentPrincipal添加声明。这很好。
protected void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs args)
{
var customPrincipal = new ClaimsPrincipal(args.ClaimsPrincipal);
var service = ServiceLocator.Current.GetInstance<IServices>();
Thread.CurrentPrincipal = customPrincipal;
var result = service.GetPemissions();
foreach (var claim in result.Claims)
customPrincipal.Identities.First().Claims.Add(new Claim(claim.ClaimType, claim.Value));
Thread.CurrentPrincipal = customPrincipal;
args.ClaimsPrincipal = customPrincipal;
}
在某些时候,我想向WCF服务发出请求,并将声明传递给服务。如果我使用CreateChannelActingAS传入引导令牌,我不会获得从上一步添加到主体的声明。
var claimsPrincipal = Thread.CurrentPrincipal as IClaimsPrincipal;
var securityToken = claimsPrincipal.Identities.First().BootstrapToken;
using (var channel = channelFactory.Value.CreateChannelActingAs(securityToken) as IClientChannel)
{
try
{
invocation.ReturnValue = invocation.Method.Invoke(channel, invocation.Arguments);
{ ...
有没有办法在WCF服务中构建一个ClaimsPrincipal,并且在UI层中添加了额外的声明?我可以创建一个新的securityToken并通过该频道传递它,还是有更好的方法来处理这个问题?
答案 0 :(得分:0)
Bootstraptoken实际上是WIF标识最初创建的标记,因此它不包含在初始创建后添加或转换的任何声明。 WIF的工作方式(使用安全令牌)意味着调用客户端永远不能以任何方式操纵令牌内容(或者至少接收者不应该能够验证此类恶意令牌)。
根据所选的IDM架构,有一些选项可供选择。最简单的选择是再次调用STS并在RequestSecurityToken请求中指定所需的附加声明。然而,考虑到STS要么接受或否认传入的声明,并且在自定义STS代码中有许多选项来处理它。如果无法控制STS(并且不能设置中间转发器),那么困难的方法可能是使用额外的WCF安全性,例如支持令牌。如果要在WCF道路上进一步委派它们,则需要手动配置和操作。
注意警告,身份管理模型本质上是信任关系的集合,并且通过允许STS客户端指定站点范围(或者令牌分布/联合/等等),有效声明是相当阴暗的设计。毕竟,由于索赔现在来自WCF调用者,因此可以简单地将它们作为WCF方法调用中的参数传递,并且具有完全相同的安全级别。将它们添加到WIF身份令牌(正确)的唯一好处是它们将在ActAs / OnBehalfOf情况下自动委派/共享。