Actualmente autenticamos las llamadas de WCF A un servicio a través de ADFS, mediante el siguiente procedimiento:
En primer lugar, obtenemos un token SAML de ADFS
using (var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(System.ServiceModel.SecurityMode.TransportWithMessageCredential),
new System.ServiceModel.EndpointAddress(new Uri(_aDFSUsernameMixedUri))))
{
System.IdentityModel.Configuration.SecurityTokenServiceConfiguration serviceConfig = new System.IdentityModel.Configuration.SecurityTokenServiceConfiguration();
factory.Credentials.UserName.UserName = _apiUser;
factory.Credentials.UserName.Password = _apiPassword;
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = serviceConfig.CertificateValidationMode;
factory.TrustVersion = System.ServiceModel.Security.TrustVersion.WSTrust13;
WSTrustChannel channel = null;
try
{
var rst = new RequestSecurityToken
{
RequestType = WSTrust13Constants.RequestTypes.Issue,
AppliesTo = new System.ServiceModel.EndpointAddress(_endpointUri),
TokenType = "urn:oasis:names:tc:SAML:2.0:assertion",
//KeyType = KeyTypes.Symmetric
KeyType = KeyTypes.Bearer
};
var token = factory.CreateChannel().Issue(rst) as System.IdentityModel.Tokens.GenericXmlSecurityToken;
Utilizamos el punto final / adfs / services / trust / 13 / usernamemixed (variable _aDFSUsernameMixedUri). Este punto final es proxy habilitado.
En segundo lugar, usamos este token SAML para contactar con nuestro servicio:
using (HttpClient httpClient = new HttpClient() { BaseAddress = baseAddress })
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("SAML", saml);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string jsonString = JsonConvert.SerializeObject(model);
HttpResponseMessage response = await httpClient.PostAsync(Url, new StringContent(jsonString, Encoding.UTF8, "application/json"));
return response;
}
Vale la pena mencionar que el servicio solo acepta solicitudes autenticadas, y leerá los detalles de autorización del token SAML (que está firmado y encriptado). Así es como se asegura el servicio.
Ahora queremos proteger nuestro servidor ADFS mediante el uso de un Proxy ADFS (Proxy de aplicación web). La llamada a ADFS para el token SAML aún funciona y devuelve un token SAML. Sin embargo, el segundo paso falla . HTTPRequest está bloqueado por el servidor proxy de ADFS y redirige la llamada a la página de inicio de sesión de ADFS , que, por supuesto, no es lo que quiero.
Ya he intentado configurar passiveRedirectEnabled="false", pero esto no ayuda. ¿Alguna idea de dónde debo colocar el token SAML en la solicitud HTTP para que el proxy sepa que se trata de una solicitud autenticada?
ACTUALIZACIÓN
El Proxy ADFS utiliza un EdgeAccessCookie para decidir si redirige o no la solicitud al servidor ADFS. En caso de que pudiera agregar este EdgeAccessCookie a la solicitud, el proxy probablemente dejaría de bloquear la solicitud. ¿Cómo puedo recuperar este EdgeAccessCookie en una solicitud de WCF?