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.

questionAnswers(1)

yourAnswerToTheQuestion