2

我想从 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 并通过通道传递它,还是有更好的方法来解决这个问题?

4

1 回答 1

0

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

根据选择的 IDM 架构,有一些关于如何进行的选项。最简单的选择是再次调用 STS 并在 RequestSecurityToken 请求中指定所需的附加声明。但是,STS 正在考虑接受或拒绝传入的声明,并且在自定义 STS 代码中有多种处理此问题的选项。如果无法控制 STS(并且无法设置中间转发器),那么困难的方法可能是使用额外的 WCF 安全性,例如支持令牌。如果要在 WCF 道路上进一步委派这些,则需要手动配置和操作。

不过需要注意的是,身份管理模型本质上是信任关系的集合,并且通过允许 STS 客户端指定站点范围(或令牌分发/联合/等的任何地方)有效声明是相当阴暗的设计。毕竟,由于声明现在来自 WCF 调用者,因此可以简单地将它们作为 WCF 方法调用中的参数传递,无论如何具有完全相同的安全级别。将它们添加到 WIF 身份令牌(正确)的唯一好处是它们将在 ActAs/OnBehalfOf 情况下自动委托/共享。

于 2012-08-10T18:47:03.963 回答