Pergunta

Eu procurei (sondei, até) uma resposta para isso, mas não encontrei nada útil até agora.Sou muito novo no ADFS, STS em geral e WIF, então desculpe qualquer ignorância óbvia ou uso inadequado de terminologia.;)

Atualmente estou integrando um aplicativo MVC3 personalizado com um IdP externo, via ADFS.A configuração do ADFS para IdP está concluída e funcionando.

Algumas partes do site estão disponíveis para usuários diretos - no modo de autenticação web.config foi definido como nenhum.As outras partes são protegidas por terem seus controladores/métodos de ação decorados por um System.Web.Mvc.AuthorizeAttribute personalizado.

Todas as modificações usuais no web.config para uso do WsFederationAuthenticationModule foram feitas e funciona 95%;o usuário pode navegar até as partes abertas diretamente do site.Quando eles tentam atingir as partes protegidas, o atributo de autorização verifica se eles têm alguma informação personalizada de nosso IdP no IClaimsPrincipals associado ao HttpContext.Current.User e então define o ActionResult como 401, caso contrário;O WsFederationAuthenticationModule entra em ação e os redireciona para a página de login do IdP.Quando eles inserem seus dados, eles são redirecionados com sucesso com alguns cookies FedAuth e a autorização é aprovada.

O problema começa quando eles acessam a página de login do IdP.Este IdP específico tem um link para retornar você diretamente ao nosso site (para a mesma página para a qual a solicitação original foi feita), com esta resposta SAML incorporada em algum lugar (isso está de acordo com a documentação)

urna:oásis:nomes:tc:SAML:2.0:status:Autenticação falhou

Neste ponto, eles agora estão "Não autorizados" e tudo o que o usuário verá (pelo menos no dev) é uma página 401.Você tem que encerrar a sessão ou se livrar do cookie para começar novamente.

O que preciso fazer é interceptar a solicitação de redirecionamento do IdP e, essencialmente, verificar esse status SAML específico, porque o usuário deverá então ser redirecionado para uma das áreas não autorizadas como se nada tivesse acontecido.Eu tentei algo assim no global.asax:

 protected void Application_Start()
    {
        // mvc stuff here....

        // add handler to intercept handling creation of security tokens by WsFederationAuthnticationModule
        FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
    }

    void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
    {
        FederatedAuthentication
            .WSFederationAuthenticationModule
            .SessionSecurityTokenCreated += WSFederationAuthenticationModule_SecuityTokenCreated;
    }

    public void WSFederationAuthenticationModule_SecuityTokenCreated (Object sender, SessionSecurityTokenCreatedEventArgs args) 
    {          
        var token = args.SessionToken;
        // do something with the session token here e.g. check for SAML status
    }

..mas não consigo ver nada de útil nesse token;nada para indicar um status de resposta específico.O fato de existir um cookie FedAuth de forma alguma mas nenhuma informação personalizada do Idp é uma indicação absoluta de que o usuário esteve lá, mas de alguma forma não conseguiu se autenticar, mas, em princípio, quero poder ver esse status.Talvez eu tenha que lidar com tempos limite no IdP também....

Talvez eu esteja fazendo tudo errado ou simplesmente não entendo, mas de alguma forma posso me informar sobre como determinar esses status de resposta?

Ufa.Obrigado!:D

Foi útil?

Solução

Ok, então vou responder minha própria pergunta.

A resposta para saber se posso obter esse status personalizado do meu IdP é não, no momento.:(

Mas isso ocorre apenas porque o ADFS não está configurado para capturá-lo e transmiti-lo.Aparentemente você precisa fazer alguma codificação personalizada para capturar informações do canal traseiro que é aberto entre o ADFS e o IdP....muito além do atual escopo de trabalho.

Como uma solução alternativa no momento:

  • Se uma solicitação for feita ao site e NÃO houver token SAML, é uma nova solicitação de um usuário que não fez nenhuma tentativa de autenticação no Idp
  • Se houver um token SAML, mas nenhum ID do IdP no token (que só estará presente quando ele for autenticado corretamente), o usuário falhou na autenticação por algum motivo
    • Se houver um token SAML com o ID presente, o usuário foi autenticado corretamente

Não é ótimo, mas aceitável.Aliás, todo o crédito vai para YMC nisso ENTÃO poste o seguinte código que permite verificar tokens SAML:

void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e)
    {
        var message = SignInResponseMessage.CreateFromFormPost(Request) as SignInResponseMessage;
        var rstr = new WSFederationSerializer()
            .CreateResponse(message,
            new WSTrustSerializationContext(
                SecurityTokenHandlerCollectionManager.CreateDefaultSecurityTokenHandlerCollectionManager()));
    } 

Pç!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top