O pipeline de autenticação OWIN e como usar o middleware Katana corretamente?
Recentemente, comecei a examinar a nova estrutura de identidade do ASP.Net e o middleware Katana, há uma quantidade surpreendente de código e documentação por aí, mas estou vendo o que parece ser muitas informações conflitantes, o que eu acho que é um resultado da crescente frequência de atualizações de código.
Estou procurando usar a autenticação WsFederation em um serviço interno do ADFS 2, mas a maneira como o pipeline de autenticação OWIN funciona me deixa um pouco confuso e espero que alguém possa oferecer algumdefinitivo em formação.
Especificamente, estou interessado na ordem em que o middleware deve ser conectado e em quais módulos são necessários em vários cenários. Gostaria de me livrar de qualquer coisa que não precise estar lá e, ao mesmo tempo, garantir que o processo é o mais seguro possível.
Por exemplo, parece queUseWsFederationAuthentication
deve ser usado em conjunto comUseCookieAuthentication
, mas não tenho certeza qual é a corretaAuthenticationType
seria (esta post sugere que é apenas uma sequência de identificadores, mas é seu valor significativo?) ou mesmo se ainda precisarmos usarSetDefaultSignInAsAuthenticationType
.
Eu também noteiesta tópico no quadro de discussões do Projeto Katana, em que o Tratcher menciona um erro comum, mas não é muito específico sobre qual parte do código está com erro.
Pessoalmente, agora estou usando o seguinte (com um manipulador SAML Token personalizado para ler a sequência de tokens em um documento XML válido), funciona para mim, mas é ideal?
var appURI = ConfigurationManager.AppSettings["app:URI"];
var fedPassiveTokenEndpoint = ConfigurationManager.AppSettings["wsFederation:PassiveTokenEndpoint"];
var fedIssuerURI = ConfigurationManager.AppSettings["wsFederation:IssuerURI"];
var fedCertificateThumbprint = ConfigurationManager.AppSettings["wsFederation:CertificateThumbprint"];
var audienceRestriction = new AudienceRestriction(AudienceUriMode.Always);
audienceRestriction.AllowedAudienceUris.Add(new Uri(appURI));
var issuerRegistry = new ConfigurationBasedIssuerNameRegistry();
issuerRegistry.AddTrustedIssuer(fedCertificateThumbprint, fedIssuerURI);
app.UseCookieAuthentication(
new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType // "Federation"
}
);
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = appURI,
SignOutWreply = appURI,
Configuration = new WsFederationConfiguration
{
TokenEndpoint = fedPassiveTokenEndpoint
},
TokenValidationParameters = new TokenValidationParameters
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
},
SecurityTokenHandlers = new SecurityTokenHandlerCollection
{
new SamlSecurityTokenHandlerEx
{
CertificateValidator = X509CertificateValidator.None,
Configuration = new SecurityTokenHandlerConfiguration
{
AudienceRestriction = audienceRestriction,
IssuerNameRegistry = issuerRegistry
}
}
}
}
);
Muito obrigado por tudo o que você pode oferecer para ajudar a esclarecer essa confusão para mim.