Я пытаюсь написать консольное приложение со следующим сценарием: клиент сначала запрашивает токен у поставщика удостоверений, а затем использует этот токен, чтобы запросить новый токен из Ресурс STS По следующей ссылке: http://leastprivilege.com/2010/10/28/wif-adfs-2-and-wcfpart-6-chaining-multiple-token-services/активный клиент - получить токен от adfs-партнера ресурса с помощью idp idp
Мне удалось получить токен от Idp, но не удалось получить токен из Resource STS.
Это мой код:
string RPRealm = "https://service.contoso.com/";
string RSTSRealm = "http://fsweb.contoso.com/adfs/services/trust";
string IdPstsEndpoint = "https://IdpAdfs.domain.com/adfs/services/trust/13/kerberosmixed";
string RSTSEndpoint = "https://fsweb.contoso.com/adfs/services/trust/13/IssuedTokenMixedSymmetricBasic256";
private static SecurityToken GetIdPToken(string rstsRealm, string IdPstsEndpoint)
{
using (var factory = new WSTrustChannelFactory(
new KerberosWSTrustBinding(SecurityMode.TransportWithMessageCredential),
new EndpointAddress(new Uri(IdPstsEndpoint))))
{
WSTrustChannel channel = null;
factory.TrustVersion = TrustVersion.WSTrust13;
try
{
var rst = new RequestSecurityToken
{
RequestType = WSTrust13Constants.RequestTypes.Issue,
AppliesTo = new EndpointAddress(rstsRealm),
KeyType = WSTrust13Constants.KeyTypes.Bearer,
};
channel = (WSTrustChannel)factory.CreateChannel();
RequestSecurityTokenResponse rstr;
SecurityToken token = channel.Issue(rst, out rstr);
return token;
}
finally
{
if (channel != null)
{
channel.Abort();
}
factory.Abort();
}
}
}
private static SecurityToken GetRSTSToken(SecurityToken IdPToken, string RSTSEndpoint, string RPRealm)
{
var binding = new WS2007FederationHttpBinding();
binding.Security.Message.IssuedKeyType = SecurityKeyType.BearerKey;
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Mode = WSFederationHttpSecurityMode.TransportWithMessageCredential;
using (var factory = new WSTrustChannelFactory(
binding,
new EndpointAddress(new Uri(RSTSEndpoint))))
{
var rst = new RequestSecurityToken
{
RequestType = WSTrust13Constants.RequestTypes.Issue,
AppliesTo = new EndpointAddress(RPRealm),
KeyType = WSTrust13Constants.KeyTypes.Bearer,
};
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
factory.TrustVersion = TrustVersion.WSTrust13;
factory.Credentials.SupportInteractive = false;
factory.ConfigureChannelFactory();
var channel = factory.CreateChannelWithIssuedToken(IdPToken);
RequestSecurityTokenResponse rstr;
SecurityToken token = channel.Issue(rst, out rstr);
return token;
}
}
Я получаю эту ошибку: тип содержимого текста/html сообщения ответа не соответствует типу содержимого привязки (приложения/мыло + XML, кодировка = utf-8) Что такое worng с моим кодом? Заранее спасибо
Попробуйте использовать привязки WSTrust в Thinktecture.IdentityModel - например. для второго хопа используйте IssuedTokenWSTrustBinding. – leastprivilege
Если я использую IssuedTokenWSTrustBinding, я получаю ошибку: подписи маркера Generic XML маркер: validFrom: 05/05/2013 14:51:22 validTo: 05/05/2013 15:51:22 InternalTokenReference: SamlAssertionKeyIdentifierClause (AssertionId = '_29979767-107a-4c16-b59b-4a9462edfea3') ExternalTokenReference: SamlAssertionKeyIdentifierClause (AssertionId = '_29979767-107a-4c16-b59b-4a9462edfea3') маркера Элемент: (EncryptedData, http://www.w3.org/2001/04/xmlenC#) не имеет ключей. Маркер безопасности используется в контексте, который требует, чтобы он выполнял криптографические операции, но токен не содержит криптографических ... – user1551454