2012-08-09 70 views
2

我想访问从WCF服务添加到UI层当前主体的自定义声明。 我有一个Web应用程序,一旦用户被STS认证,就会向CurrentPrincipal添加声明。这工作正常。WIF ChannelActingAs从WCF访问声明

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

Bootstraptoken实际上是WIF标识最初创建的标记,因此它不包含在初始创建后添加或转换的任何声明。 WIF的工作方式(使用安全令牌)意味着呼叫客户端永远无法以任何方式操纵令牌内容(或者至少接收者不应该能够验证此类恶意令牌)。

根据所选的IDM体系结构,还有一些关于如何继续的选项。最简单的选择是再次调用STS并在RequestSecurityToken请求中指定所需的附加声明。然而,考虑到STS要么接受或拒绝即将到来的要求,并且在自定义STS代码中有多种选择来处理这个问题。如果没有对STS的控制(并且不能设置中间中继器),那么困难的方法可能是使用额外的WCF安全性,例如支持令牌。这些要求手动配置和操作,如果他们将沿WCF道路进一步授权。

虽然身份管理模型基本上是信任关系的集合,并且允许STS客户端指定站点范围内(或永远将令牌分布/联合/等等)有效索赔是相当阴暗的设计。毕竟,由于声明现在来自WCF调用者,因此可以简单地将它们作为WCF方法中的参数进行传递,并调用完全相同的安全级别。将它们添加到WIF身份标记(正确)的唯一好处是它们将在ActAs/OnBehalfOf情况下自动委派/共享。