Attualmente autenticiamo le chiamate WCF a un servizio tramite ADFS, utilizzando la seguente procedura:
In primo luogo, otteniamo un token SAML da 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;
Usiamo il / adfs / services / trust / 13 / usernamemixed endpoint (variabile _aDFSUsernameMixedUri). Questo endpoint è abilitato per il proxy.
In secondo luogo, utilizziamo questo token SAML per contattare il nostro servizio:
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 ricordare che il servizio accetta solo richieste autenticate e leggerà i dettagli dell'autorizzazione dal token SAML (che è firmato e crittografato). È così che il servizio è protetto.
Ora vogliamo proteggere il nostro server ADFS utilizzando un proxy ADFS (proxy dell'applicazione Web). La chiamata a ADFS per il token SAML funziona ancora e restituisce un token SAML. Tuttavia, il secondo passaggio non riesce . HTTPRequest è bloccato dal server proxy ADFS e reindirizza la chiamata alla pagina di accesso ADFS , che ovviamente non è quello che voglio.
Ho già provato a impostare passiveRedirectEnabled="false", ma questo non aiuta. Qualche idea su dove devo mettere il token SAML in HTTPRequest per far sapere al proxy che si tratta di una richiesta autenticata?
UPDATE
Il proxy ADFS utilizza un EdgeAccessCookie per decidere se reindirizzare o meno la richiesta al server ADFS. Nel caso in cui potessi aggiungere questo EdgeAccessCookie alla richiesta, il proxy probabilmente interromperebbe il blocco della richiesta. Come posso recuperare questo EdgeAccessCookie in una richiesta WCF?