ERRO ADFS V2.0: MSIS7042: A mesma sessão do navegador do cliente fez '6' solicitações no último '1' segundos

StackOverflow https://stackoverflow.com/questions/2640030

Pergunta

Pessoal, eu tenho um aplicativo ASP.NET MVC que estou tentando garantir o uso da versão candidata de liberação do ADFS v2.0 (Genebra). Configurei o aplicativo como uma confiança da parte que confia e usei o fedutil.exe para modificar o web.config do aplicativo, para que ele tenha informações sobre o servidor de Genebra e use o servidor de Genebra como sua fonte de reivindicações.

No entanto, quando tento atingir o aplicativo MVC, ele redireciona para Genebra, que então (depois de me avisar sobre os certificados autoassinados) novamente me dirige para o aplicativo MVC novamente. Depois de aceitar alertas de certificação autoassinada, os dois servidores jogam pingue-pongue entre si em um loop de redirecionamento infinito até que finalmente Genebra vomite a seguinte mensagem:

A mesma sessão do navegador do cliente fez solicitações '6' nos últimos '1' segundos. Pode haver uma possível configuração ruim. Entre em contato com seu administrador para obter detalhes.

Não há erros nos logs de eventos no lado do MVC ou no Genebra, exceto por um evento que contém a mensagem acima. Se alguém pudesse me fornecer algumas informações sobre como tentar depurar, diagnosticar e, esperançosamente, corrigir esse problema, ficaria eternamente grato.

Novamente, a caixa de Genebra é o candidato a lançamento do ADFS v2.0 e o site do ASP.NET MVC foi construído usando a versão mais recente (final de '09) do Windows Identity Foundation SDK com web.config modificado usando fedutil.exe do wif sdk .


Então todos vocês vão dar um chute com isso ... tentei o mesmo aplicativo do Firefox e ... funciona. Sou solicitado pelas minhas credenciais de domínio, o servidor ADFS V2 me dirige uma vez e, em seguida, acabo na página inicial do meu aplicativo, completa com o nome da minha conta e a saudação personalizada. Então agora a verdadeira questão é a seguinte: por que diabos o IE8 está sendo pego em um loop de redirecionamento infinito e o Firefox não é? Depois de testes ainda mais, consegui fazer esse cenário funcionar, fora da caixa, sem a modificação de qualquer material de pipeline padrão do ADFS V2 (RC) ou do WIF (RTW) no Safari e no Firefox. O IE8 é o único navegador a exibir qualquer problema em lidar com esse cenário de autenticação. Eu tentei de tudo, incluindo a instalação e a confiança dos certificados autoassinados, adicionando os sites à minha zona da intranet local e retirando a segurança para baixar e até definir os cookies de primeiro e terceiros sempre permitir.

Foi útil?

Solução 2

Acontece que o nome do host da parte que confia tinha um sublinhado (Khoffman_2). Aparentemente, o sublinhado é um personagem DNS ilegal e somente o IE rejeitará as informações com o sublinhado.

Renomeei minha máquina de Khoffman_2 para Khoffman2 e a combinação de festas ADFs V2/MVC funciona perfeitamente no Firefox, Safari e IE.

Outras dicas

Eu tive o mesmo problema com o ADFS 1.0 e, para resolvê -lo, certifiquei -me de que o URL tivesse um slash para a frente "/" que sempre funcionaria no Firefox e também ou seja

por exemplo : https://somedomain.com/application_2/

Embora esse não seja o seu problema, tivemos problemas idênticos ao que você descreveu. Nossa solução foi:

  1. Autenticação básica ativada no IIS (isso não resolveu nada além de necessários para as próximas 2 etapas)
  2. Desative a autenticação do Windows no IIS (isso resolveu o problema para alguns navegadores do IE, mas não tudo)
  3. Desative o acesso anônimo no IIS (isso resolveu o problema para o restante dos navegadores do IE)

A resposta de Jaxidian está próxima.

No meu caso, eu só tive que:

  • Autenticação do Windows -> Desativado

  • Auth Anonymous -> Ativado

  • ASP.NET PERSONAÇÃO -> Desativado

  • Forms Auth -> Desativado

  • Windows Auth -> Desativado

Esse loop pode ocorrer quando um usuário não está autorizado a acessar uma página.

Tivemos um atributo de autorização personalizado em nosso controlador MVC que verifica se o usuário estava em uma função com base nas reivindicações fornecidas se a configuração para useadfs fosse verdadeira nos arquivos de configuração. Eu pensei que essa configuração estava definida como True e fiquei confundida por eu continuar obtendo o loop do ADFS ao acessar a página porque eu estava nos grupos que estavam autorizados a acessar a página.

A chave para a solução de problemas era fazer uma página da web que exibia minhas reivindicações do ADFS sem necessariamente exigir autenticação.

@if (User.Identity.IsAuthenticated)
{
    <div>UserName: @User.Identity.Name;</div>

    var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
    <table>
        @foreach (var claim in claimsIdentity.Claims)
        {
        <tr><td>@claim.Type</td><td>@claim.Value</td></tr>
        }
    </table>


}

Percebi que estava sendo conectado ao ADFS e minhas reivindicações estavam sendo definidas, então o ADFS estava funcionando. O problema real era que meu arquivo de configuração tinha userAdfs = "true" em vez de useadfs = "true", o que basicamente fez com que meu código de autorização personalizado retornasse false na autorização. Portanto, a página continuou me encaminhando de volta aos ADFs para autenticar novamente.

De qualquer forma, se um usuário não tiver as reivindicações corretas para acessar a página, esse loop de login do ADFS também pode ocorrer.

Além disso, se você escreveu um atributo Authorize personalizado, verifique o link a seguir que descreve como evitar o loop.

Redirecionar loop com o atributo Autorize do .NET MVC com reivindicações do ADFS

Código de manipulador personalizado HandleNa -AuthorizedRequest para Autorizeattribute desse link:

 protected override void HandleUnauthorizedRequest System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            //One Strategy:
            //filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);

            //Another Strategy:
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                    {
                        controller = "u",
                        action = "LoginStatus",
                        errorMessage = "Error occurred during authorization or you do not have sufficient priviliges to view this page."
                    })
                );
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top