Muitos cookies OpenID.nonce causam "Solicitação incorreta"

Eu já passei por linksaqui, aqui eaqui que estão relacionados ao problema que estou tendo.

Eu tenho o aplicativo Silverlight usando o IdentiServer3 para autenticação e comecei a ter esse problema agora quando implementei a funcionalidade de logout. Observe que o problema não tem nada a ver com o Silverlight porque a funcionalidade de login e logout é realmente implementada no lado do servidor, que é um formulário clássico da Web do ASP.Net. (.NET 4.5.1)

O aplicativo nunca teve a funcionalidade de logout; portanto, o usuário costumava fechar o navegador para nunca encontrar esse problema antes. Agora temos a página logout.aspx e o aplicativo Silverlight tem um link para esta página.

Página Logout.aspx

public partial class Logout : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)
        {
            Session.Clear();
            Request.GetOwinContext().Authentication.SignOut();
        }
        Response.Redirect("/");
    }
}

Página Default.aspx. Esta é a página inicial

public partial class Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Send an OpenID Connect sign-in request.
        if (!System.Web.HttpContext.Current.Request.IsAuthenticated)
        {
            HttpContext.Current.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
        }
    }
} 

Classe de inicialização OWIN em que a conexão OpenID está configurada

  app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            LoginPath = new Microsoft.Owin.PathString("/Default.aspx")
        });

  app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["Authority"],
            Scope = "openid profile",
            ClientId = ConfigurationManager.AppSettings["ClientId"],
            RedirectUri = ConfigurationManager.AppSettings["RedirectUri"],
            ResponseType = "id_token",
            SignInAsAuthenticationType = "Cookies",

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                SecurityTokenValidated = (context) =>
                {

                    var id = context.AuthenticationTicket.Identity;

                    // create new identity
                    var newIdentity = new ClaimsIdentity(id.AuthenticationType);

                    // we want to keep username and subjectid                        
                    var sub = id.FindFirst(ClaimTypes.NameIdentifier);
                    var username = id.FindFirst("preferred_username");
                    newIdentity.AddClaim(username);
                    newIdentity.AddClaim(sub);

                    // keep the id_token for logout
                    newIdentity.AddClaim(new Claim("id_token", context.ProtocolMessage.IdToken));

                    context.AuthenticationTicket = new AuthenticationTicket(
                        newIdentity,
                        context.AuthenticationTicket.Properties);

                    return Task.FromResult(0);
                },

                RedirectToIdentityProvider = (context) =>
                {
                    if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                    {
                        var idTokenHint = context.OwinContext.Authentication.User.FindFirst("id_token").Value;
                        context.ProtocolMessage.IdTokenHint = idTokenHint;
                    }
                    return Task.FromResult(0);
                },                    
            }

Etapas para reproduzir o problema:

Eu digito o URL do site que me redireciona para a página de login do servidor de identidade3.Eu insiro credenciais e clico no login.Após o login bem-sucedido, sou redirecionado para o site e lá clico em Sair.

Eu sou desconectado com sucesso. O violinista mostra as seguintes chamadas

https://idsvr.mydomain.com/identity/connect/endsession?id_token_hint=XXXXXXXXXXXXXX https://idsvr.mydomain.com/identity/logout?id=616dd9a4e4c6a55b0bb27faceb4df8dd https://idsvr.mydomain.com/identity/connect/endsessioncallback?sid=xxxxxx

Eu paro emhttps://idsvr.mydomain.com/identity/logout?id=xxxxxxx página conforme o esperado.

Agora eu fecho o navegador (esta etapa é importante)Agora digite o URL do site novamente, o que me redireciona para a página de login do servidor de identidade. (como a Etapa 1)Eu insiro credenciais e clico no login.Após o login bem-sucedido, o IdentityServer faz o POST no site e cria o AuthenticationTicket. No entanto, aquiHttpContext.Current.Request.IsAuthenticated é falso entãoDefault.aspx a página é redirecionada para o IdentityServer. Já estou logado para que o Indetityserver redirecione para o site do cliente e os loops continuem.

O Fiddler mostra várias viagens de ida e volta do identityServer à página default.aspx do site. Cada ida e volta continua adicionandoOpenIdConnect.nonce.OpenIdConnect cookie e, finalmente, recebo erro de solicitação ruim por causa do tamanho máximo da solicitação.

Então, como sugerido nos links acima, eu desclassifiqueiMicrosoft.Owin.Security.OpenIdConnect para3.0.0 no aplicativo cliente.

No entanto, ainda fico preso em loop contínuo. A única diferença é que agora ele não adiciona novosOpenIdConnect.nonce.OpenIdConnect cookie para cada ida e volta. O Violinista mostra apenas um cookie para cada ida e volta. ContudoHttpContext.Current.Request.IsAuthenticated ainda é falso. Então, eu fico preso em loop contínuo.

questionAnswers(2)

yourAnswerToTheQuestion