カスタム STS サービスを使用して使用を認証する製品をテストしています。以前は、ユーザーがブラウザーを使用して Web サイトにアクセスすると、リダイレクトを発行して STS サービスにアクセスしていました。STS サービスは、AD をヒットしてユーザーを認証し、ユーザーのカスタム クレームを含む SAML トークンを発行します。次に、Web サイトはもう一度 STS にアクセスして ActAs トークンを取得し、データ サービスと通信できるようにします。
そして、この動作を模倣し、本番環境で正常に機能する自動化がありました。
AD に直接アクセスする代わりに、ADFS を使用して認証するように STS を変更していません。そのため、Web サイトにアクセスすると、リクエストはユーザーを認証してトークンを発行する ADFS エンドポイントにリダイレクトされます。次に、トークンを使用してユーザーを認証するカスタム STS サービスをヒットし (AD をヒットする代わりに)、カスタム クレームを追加し、ユーザーの SAML トークンを発行します。次に、これを使用して ActAs トークンを生成し、最終的にデータ サービスにアクセスします。
この変更された動作に合わせて自動化を更新しようとしています。そのため、私が今行っていることは、ADFS サービスにヒットし、トークンを取得して、そのトークンを STS サービスに渡して、SAML トークンを発行できるようにすることです。
Windows ID サービスに関しては、私はかなりの素人なので、この作業を行うのに苦労しています。ADFS からトークン (Bearer Token) を正常に取得しましたが、このトークンをカスタム STS に渡して SAML トークンを発行できるようにする方法がわかりません。
どんな助けでも大歓迎です。ありがとう!
ここに私が使用しているコードがあります
public static SecurityToken GetSecurityToken()
{
var endPoint = new EndpointAddress(new Uri(@"ADFS endpoint"));
var msgBinding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential, false);
msgBinding.Security.Message.EstablishSecurityContext = false;
msgBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
var factory = new WSTrustChannelFactory(msgBinding, endPoint);
factory.TrustVersion = TrustVersion.WSTrust13;
factory.Credentials.SupportInteractive = true;
factory.Credentials.UserName.UserName = "user";
factory.Credentials.UserName.Password = "pwd";
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Bearer,
AppliesTo = new EndpointReference(@"custom STS endpoint")
};
return factory.CreateChannel().Issue(rst);
}
public static void GetUserClaimsFromSecurityTokenService(SecurityToken secToken)
{
var securityTokenManager = new SecurityTokenHandlerCollectionManager(string.Empty);
securityTokenManager[string.Empty] = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();
var trustChannelFactory = new WSTrustChannelFactory(Binding, new EndpointAddress("custom STS endpoint"))
{
TrustVersion = TrustVersion.WSTrust13,
SecurityTokenHandlerCollectionManager = securityTokenManager,
};
var rst = new RequestSecurityToken(RequestTypes.Issue)
{
AppliesTo = new EndpointReference("website url"),
TokenType = SamlSecurityTokenHandler.Assertion
};
var channel = (WSTrustChannel)trustChannelFactory.CreateChannel();
channel.Open(TimeSpan.FromMinutes(15));
try
{
RequestSecurityTokenResponse rstr;
SecurityToken token = channel.Issue(rst, out rstr);
var genericToken = (GenericXmlSecurityToken)token;
var req = new SamlSecurityTokenRequirement();
var handler = new SamlSecurityTokenHandler(req)
{
Configuration = new SecurityTokenHandlerConfiguration()
};
var newToken = handler.ReadToken(new XmlNodeReader(genericToken.TokenXml));
}
finally
{
channel.Close();
}
}