3

在理解如何在本地桌面应用程序中使用声明方面,我非常感谢一些帮助。这是场景:我想根据用户是否有类似“AnalysisAllowed:true”的声明来显示一个选项卡 fe。所以我想在应用程序启动时获取声明并稍后绑定它们。

所有示例都在讨论如何使 WCF 使用 Authorization- 和 AuthenticationManagers 对其他 WCF-Services 进行基于声明的调用,但我只想联系 sts(我该怎么做?WCF-Fed 绑定?)然后缓存使用它的东西。没有其他服务电话... :)

非常感谢!

4

2 回答 2

2

在默认配置(客户端和 STS)中,您获得的令牌将被加密(除了被签名)。如果您拥有整个事物(客户端和服务),那么您可以调整一些旋钮,以便可以从客户端“读取”令牌(因此,未加密)。

在这里,您有一些代码将为您提供来自 ADFS 的未加密 SAML 令牌(关键是要求“不记名”令牌并在没有加密证书的情况下配置 ADFS 依赖方)。

private static SecurityToken GetSamlToken(string realm, string stsEndpoint, ClientCredentials clientCredentials)
{
    using (var factory = new WSTrustChannelFactory(
        new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
        new EndpointAddress(new Uri(stsEndpoint))))
    {
        factory.Credentials.UserName.UserName = clientCredentials.UserName.UserName;
        factory.Credentials.UserName.Password = clientCredentials.UserName.Password;
        factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
        factory.TrustVersion = TrustVersion.WSTrust13;

        WSTrustChannel channel = null;

        try
        {
            var rst = new RequestSecurityToken
                          {
                              RequestType = WSTrust13Constants.RequestTypes.Issue, 
                              AppliesTo = new EndpointAddress(realm), 
                              KeyType = KeyTypes.Bearer, 
                          };

            channel = (WSTrustChannel)factory.CreateChannel();

            return channel.Issue(rst);
        }
        finally
        {
            if (channel != null)
            {
                channel.Abort();
            }

            factory.Abort();
        }
    } 

获得令牌后,您可以使用 LINQ to XML 或 WIF 从 SecurityToken 中获取 ClaimsIdentity。确保您在客户端与 STS 和服务之间使用 SSL。

第二种选择是依靠服务返回索赔清单。这是另一个请求,但您将在用户登录的同时执行此操作,然后缓存这些声明,直到令牌过期。

public IEnumerable<Claim> GetUserClaims() {
      // get Thread.CurrentPricinpal IClaimsIdentity and grab the claims
}
于 2012-07-16T13:08:53.857 回答
0

我不确定您使用的是什么 STS,但通常(例如,使用 AD FS 2.0),您将使用 WS-Trust 连接到 STS Web 服务。这是主动联合与被动联合。

请查看此处的实验室 4 ,了解如何执行此操作的一些示例。

于 2012-07-16T12:19:44.893 回答