【问题标题】:Get Claims from STS in DesktopApp (active)在 DesktopApp 中从 STS 获取声明(活动)
【发布时间】:2012-07-15 00:32:17
【问题描述】:

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

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

非常感谢!

【问题讨论】:

    标签: desktop-application wif claims


    【解决方案1】:

    在默认配置(客户端和 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
    }
    

    【讨论】:

    • 非常感谢您提供详细的代码。我知道有很多部分我不太了解。但是您的代码对指导我很有帮助! :)
    • 这正是我想要的——从桌面应用程序中获取给定用户名/密码的令牌。但是,当我运行它时,我不断从服务器收到“(405)方法不允许”。有什么指点吗?
    【解决方案2】:

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

    查看 Lab 4 here 获取有关如何执行此操作的一些示例。

    【讨论】:

    • 感谢您的回答。我知道 STS(在我的例子中是 SelfSTS 的初学者)提供了一个 WS-Trust Endpoint,但它不像调用一个简单的 http WCF Endpoint。这就是我寻求更多指导的原因。
    • 关于实验室:也许我正在监督这个,但这更多的是关于如何使用 WIF 从应用程序与 wcf 服务通信,不是吗?我正在寻找的是在客户端内部获得使用声明以启用/禁用控件。
    猜你喜欢
    • 2014-09-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2017-03-04
    • 2014-04-03
    相关资源
    最近更新 更多