【问题标题】:WIF SAML RequestSecurityToken STS Internal server errorWIF SAML RequestSecurityToken STS 内部服务器错误
【发布时间】:2014-07-22 02:43:20
【问题描述】:

我尝试访问我的 STS 以请求令牌。该代码基于@leastprivilege 的博客文章:WCF and Identity in .NET 4.5: External Authentication with WS-Trust。我使用显式方法(通过代码)。

    private static SecurityToken RequestSecurityToken()
{
            // set up the ws-trust channel factory
            var factory = new WSTrustChannelFactory(
                new UserNameWSTrustBinding(
                  SecurityMode.TransportWithMessageCredential),
                  "https://federation.mydomain/adfs/services/trust/mex") { TrustVersion = TrustVersion.WSTrust13 };

            //factory.Credentials.SupportInteractive = false;
            factory.Credentials.UserName.UserName = "user-pcote";
            factory.Credentials.UserName.Password = "123456";

            // create token request
            var rst = new RequestSecurityToken
            {
                RequestType = RequestTypes.Issue,
                KeyType = KeyTypes.Symmetric,
                AppliesTo = new EndpointReference("https://myRP/")
            };

            var channel = factory.CreateChannel();
            return channel.Issue(rst);
        }

在浏览器中复制 STS 端点地址时可以看到 XML,因此可以访问联合服务器。但是一旦我发出令牌请求,我总是会收到内部服务器错误(500)。有没有人知道我的问题可能在这里。

【问题讨论】:

    标签: security wif saml


    【解决方案1】:

    最后设法通过将 KeyType 更改为 KeyTypes.Bearer 来使其工作(因为没有证书应用于 AD FS 中的 RP)。我将 myseflf 建立在这个网站上,它很好地解释了这一切的关系:

    http://blog.skadefro.dk/2011/09/claimsbased-authentication-and-wcf.html

    如果我们查看 Microsoft.IdentityModel.SecurityTokenService.KeyTypes 我们 看到我们可以使用非对称、对称或承载。大量的帖子在那里 关于这个。

    如果您使用非对称,您作为请求者需要提供密钥来加密 索赔。 (设置“UseKey”)

    如果您使用 Symmetric,身份提供者已经被告知 使用什么证书来加密声明。

    如果您选择承载。令牌已签名,但声明不会 加密。如果已在 信赖方,索赔将根本不包括在内。

    当您请求令牌时,令牌会被签名(未加密) 身份提供程序 (ADFS) 上安装的证书。如果你添加一个 ADFS 服务器上依赖方信任 (RP) 上的证书, 令牌中的声明使用该证书加密。 只有有权访问该私钥的主机/应用程序 证书现在可以解密令牌并读取声明。你不 需要阅读声明以验证您的身份。为了 例如,如果你有一个 WCF 服务你想从一个 应用。您仍然可以从该应用程序中请求 来自 ADFS 服务器的令牌,然后使用该令牌访问 WCF 服务 令牌。只要 WCF 服务可以访问私钥并且 可以读取声明,您的应用程序不需要它。

    private static SecurityToken RequestSecurityToken()
            {
    
                var binding = new UserNameWSTrustBinding(
                      SecurityMode.TransportWithMessageCredential);
    
                var factory = new WSTrustChannelFactory(
                    binding,
                    new EndpointAddress(new Uri("<your_adfs_uri>/adfs/services/trust/13/usernamemixed"), EndpointIdentity.CreateSpnIdentity("host/your.spn.com"))) { TrustVersion = TrustVersion.WSTrust13 };
    
                factory.Credentials.UserName.UserName = "username";
                factory.Credentials.UserName.Password = "password";
    
                // create token request
                var rst = new RequestSecurityToken
                {
                    RequestType = RequestTypes.Issue,
                    KeyType = KeyTypes.Bearer,
                    AppliesTo = new EndpointReference(<uri_of_your_relying_party>)
                };
    
                var channel = factory.CreateChannel();
                try
                {
                    var response = channel.Issue(rst);
                    return response ;
                }
                catch (Exception e)
                {
                    var message = e.Message;
                    return null;
                }
    
            }
    

    【讨论】:

    【解决方案2】:

    我设法找到了正确的端点(即 /adfs/services/trust/13/usernamemixed),但现在我收到以下错误:

    ID4007:请求的安全令牌内的对称密钥必须加密

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多