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