net asp c# authentication asp.net-core

c# - asp - No se especificó authenticationScheme, y no se encontró DefaultChallengeScheme.



asp.net core authentication (3)

Para aquellos que aterrizan en esto y se sienten frustrados, mi consejo es que echen un vistazo a la respuesta a esta pregunta: ASP.NET Core 2.0 middleware de autenticación.

Sin volver a iterar lo que encuentra allí, parece que este problema está relacionado con los cambios en la seguridad entre ASP.Net Core 1 y 2. Ciertamente, el consejo allí resolvió mis propios problemas. También vale la pena echar un vistazo a esta publicación del blog: https://ignas.me/tech/custom-authentication-asp-net-core-20/ (que sospecho que se escribió en base a esa respuesta de SO)

Estoy utilizando el siguiente código para la autenticación en ASP.NET Core 2.0 mediante cookies

services .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie("MyCookieMiddlewareInstance", options => { options.AccessDeniedPath = new PathString("/Account/Login"); options.LoginPath = new PathString("/Account/Login"); options.LogoutPath = new PathString("/Account/LogOff"); });

Estoy recibiendo un error:

No se especificó authenticationScheme, y no se encontró DefaultChallengeScheme

La configuración de las cookies se encuentra a continuación:

var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, userId.ToString()), new Claim(ClaimTypes.Name, userName) }; var identity = new ClaimsIdentity(claims, "Forms"); identity.AddClaim(new Claim(ClaimTypes.Role, "ADMIN")); var principal = new ClaimsPrincipal(identity); HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal, new AuthenticationProperties { IsPersistent = isPersistent, ExpiresUtc = DateTime.UtcNow.AddYears(1) });

Hice una investigación y no encontré la solución. Aquí hay un enlace al documento que utilicé:

¿Puede alguien, por favor, decirme cómo puedo resolver este problema?


HttpContext.Authentication está obsoleta en ASP.net core 2.0, así que en su lugar HttpContext.Authentication.SignInAsync usa HttpContext.SignInAsync


authenticationBuilder.AddCookie("MyCookieMiddlewareInstance", …)

Esto registra un controlador de autenticación de cookies que utiliza el nombre de esquema de autenticación "MyCookieMiddlewareInstance" . Por lo tanto, cuando se refiera al esquema de autenticación de cookies, deberá usar ese nombre exacto, de lo contrario no encontrará el esquema.

Sin embargo, en la llamada AddAuthentication , está utilizando un nombre de esquema diferente:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)

Esto registra el CookieAuthenticationDefaults.AuthenticationScheme , que tiene el valor constante "Cookies" , como el esquema de autenticación predeterminado. ¡Pero un esquema con ese nombre nunca se registra! En su lugar, solo hay una "MyCookieMiddlewareInstance" .

Así que la solución es simplemente usar el mismo nombre para ambas llamadas. También puede usar los valores predeterminados y eliminar los nombres explícitos; Si no tiene múltiples esquemas y necesita más control, realmente no hay necesidad de establecer explícitamente sus nombres.