Demasiadas cookies de OpenID.nonce causan "Solicitud incorrecta"
Ya he pasado por enlacesaquí, aquí yaquí que están relacionados con el problema que estoy teniendo.
Tengo la aplicación Silverlight que usa IdentiServer3 para la autenticación y comencé a tener este problema justo ahora cuando implementé la funcionalidad de cierre de sesión. Tenga en cuenta que el problema no tiene nada que ver con Silverlight porque la funcionalidad de inicio y cierre de sesión se implementa realmente en el lado del servidor, que es un formulario web clásico de ASP.Net. (.NET 4.5.1)
La aplicación nunca tuvo la funcionalidad de cierre de sesión, por lo que el usuario solo solía cerrar el navegador para que nunca antes nos encontráramos con este problema. Ahora tenemos la página logout.aspx y la aplicación Silverlight tienen un enlace a 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 predeterminada.aspx. Esta es la página de inicio
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);
}
}
}
Clase de inicio OWIN donde se configura la conexión OpenID
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);
},
}
Pasos para reproducir el problema:
Escribo la URL del sitio web que me redirige a la página de inicio de sesión de identityserver3.Ingreso credenciales y presiono iniciar sesión.Después de iniciar sesión con éxito, me redirigen al sitio web y allí hago clic en cerrar sesión.Me desconecté con éxito. Fiddler muestra las siguientes llamadas
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
Aterrizo enhttps://idsvr.mydomain.com/identity/logout?id=xxxxxxx página como se esperaba.
Ahora cierro el navegador (este paso es importante)Ahora escriba nuevamente la URL del sitio web que me redirige a la página de inicio de sesión del servidor de identidad. (como el paso 1)Ingreso credenciales y presiono iniciar sesión.Después de un inicio de sesión exitoso, IdentityServer realiza POST en el sitio web y el sitio web crea AuthenticationTicket. Sin embargo, aquíHttpContext.Current.Request.IsAuthenticated
es falso entoncesDefault.aspx
la página redirige a IdentityServer. Ya he iniciado sesión, por lo que Indetityserver redirige al sitio web del cliente y los bucles continúan.Fiddler muestra varios viajes de ida y vuelta desde identityServer a la página default.aspx del sitio web. Cada viaje de ida y vuelta sigue agregandoOpenIdConnect.nonce.OpenIdConnect
cookie y finalmente recibo un error de solicitud incorrecta debido al tamaño máximo de la solicitud.
Entonces, como se sugiere en los enlaces anteriores, degradéMicrosoft.Owin.Security.OpenIdConnect
a3.0.0
en la aplicación del cliente.
Sin embargo, todavía me quedo atrapado en un bucle continuo. La única diferencia es que ahora no agrega nuevosOpenIdConnect.nonce.OpenIdConnect
galleta para cada viaje de ida y vuelta. Fiddler muestra solo una cookie por cada viaje de ida y vuelta. sin embargoHttpContext.Current.Request.IsAuthenticated
Sigue siendo falso. Entonces me atasco en un bucle continuo.