从DesktopApp的STS获取声明(活动)

时间:2012-07-16 07:09:29

标签: desktop-application wif claims

我真的很感激帮助理解如何在本地桌面应用中使用声明。这是场景:我想显示一个标签f.e.取决于用户是否有“AnalysisAllowed:true”这样的声明。所以我想在应用程序启动时获取声明并在以后绑定它们。

所有样本都在谈论如何让WCF使用授权和身份验证管理器对其他WCF服务进行基于声明的调用,但我只是想联系sts(我该怎么做?WCF-Fed Binding?)和而不是缓存使用它的东西。没有其他服务电话......:)

非常感谢!

2 个答案:

答案 0 :(得分:2)

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

这里有一些代码可以从ADFS中为您提供未加密的SAML令牌(关键是要求一个" bearer"令牌并配置没有加密证书的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
}

答案 1 :(得分:0)

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

请参阅实验4 here以获取有关如何执行此操作的示例。