我尝试联系我的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)。有没有人知道这里有什么问题。
答案 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:所请求的安全令牌内的对称密钥必须加密