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.