Me gustaría autenticarme en la aplicación 1 y luego hacer clic en un enlace a la aplicación 2 y no tener que autenticarme. Me imagino un escenario muy común. Y este documento dice que es muy fácil de lograr. Así que creé una aplicación de autenticación de identidad palabra por palabra de las instrucciones aquí .
Apliqué las 2 líneas adicionales de código como se sugiere en el documento
services.AddDataProtection() .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}") .SetApplicationName("SharedCookieApp"); services.ConfigureApplicationCookie(options => { options.Cookie.Name = ".AspNet.SharedCookie"; });Luego lo implementé en mi servidor IIS local (https://localhost/App1) y funcionó perfectamente.
Para App2, apliqué las mismas dos líneas de código anteriores y las implementé en mi servidor IIS local (https://localhost/App2). Después de autenticarme en la aplicación 1 y luego hacer clic en el enlace a la aplicación 2, recibí el error "No se especificó ningún esquema de autenticación y no se encontró ningún esquema de desafío predeterminado". Supuse que tenía que faltar algo en App2, pero el documento solo ubica esas dos líneas de código. De todos modos, intenté agregar cada una de las siguientes (no todas al mismo tiempo) 4 opciones para hacerlo feliz y nada funcionó.
services.AddAuthentication("Identity.Application"); services.AddAuthentication();//fails asking for default schema and challenge services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<SharedAuthContext>();//fails services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; });Obviamente, falta algo en App2, pero no puedo resolverlo.
CookieAuthenticationDefaults.AuthenticationScheme es una cadena constante con el valor "Cookies" .
El marco de identidad utiliza diferentes nombres para sus cookies .
IdentityConstants.ApplicationScheme -> "Identity.Application"IdentityConstants.ExternalScheme -> "Identity.External" (no estamos interesados en esto)Así que deberías cambiar los nombres a
services.AddAuthentication(options => { options.DefaultScheme = "Identity.Application"; options.DefaultChallengeScheme = "Identity.Application"; }).AddCookie("Identity.Application", options => { ... });Consulte también los documentos de Microsoft sobre cómo compartir cookies entre aplicaciones.
https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-5.0