WIF SAML RequestSecurityToken STS内部服务器错误

时间:2014-07-18 18:43:27

标签: security wif saml

我尝试联系我的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)。有没有人知道这里有什么问题。

2 个答案:

答案 0 :(得分:3)

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

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

  

如果我们查看Microsoft.IdentityModel.SecurityTokenService.KeyTypes我们   看我们可以使用非对称,对称或承载。那里有很多帖子   关于这个。

     

如果使用Asymmetric,则作为请求者需要提供加密密钥   索赔。 (设置" UseKey“)

     

如果使用Symmetric,身份提供者已经准备好了   使用什么证书来加密声明。

     

如果你选择Bearer。令牌已签名,但声明不会   加密。如果已分配令牌签名证书   依赖方,索赔根本就不包括在内。

     

当您请求令牌时,令牌会被签名(未加密)   身份提供程序(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;
            }

        }

答案 1 :(得分:0)

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

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