デフォルト構成(クライアントと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を使用していることを確認してください。
あなたが持っている2番目のオプションは、クレームのリストを返すためにサービスに依存することです。これはもう1つのリクエストですが、ユーザーがログインすると同時にそれを実行し、トークンの有効期限が切れるまでそれらのクレームをキャッシュします。
public IEnumerable<Claim> GetUserClaims() {
// get Thread.CurrentPricinpal IClaimsIdentity and grab the claims
}