Ten en cuenta que en las ciencias cualquier problema casi siempre tiene más de una soluciones, no obstante te enseñamos lo mejor y más óptimo.
Solución:
Cambiar PermitirAnónimo
options.Authentication.AllowAnonymous = false;
Si tiene activado el anonimato y no está solicitando la autenticación, entonces el navegador no se autenticará. Incluso si envía creaciones, asp.net no las obtendrá a menos que haya una autenticación attribute en el controlador/método o, si va por la ruta de la función, llama al inicio de sesión.
Si no desea configurar AllowAnonymous
como false
tu podrías intentar context.ChallengeAsync
para autenticar la solicitud basada en Credential
.
Aquí está el código:
app.MapWhen(context => context.Request.Path.Equals("/sensitiveOperation") && context.Request.Method.Equals(HttpMethods.Put), subApp =>
subApp.Run(async (context) =>
var authService = context.RequestServices.GetRequiredService();
if (!context.User.Identity.IsAuthenticated)
//await context.ChallengeAsync("Windows"); //Option1
//await context.ChallengeAsync(); //Option2
await context.ChallengeAsync(HttpSysDefaults.AuthenticationScheme); //Option3
if (context.User.Identity.Name == "admin")
await context.Response.WriteAsync("Performing sensitive operation.");
// .. Do Sensitive operation....
);
);
Notapor esta vía, subApp.Run
se ejecutará dos veces, la primera solicitud no está autenticada y cuestionará la credencial, la segunda solicitud está autenticada y context.User.Identity.Name
tendrá valor. Este proceso es back-end, esto no se reflejaría en powershell
.
Estoy usando .NET Core 3.0 y en mi middleware personalizado pude obtener el ID de usuario con este código:
httpContext.User.Identity.IsAuthenticated
? new Guid(httpContext.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).First().Value)
: Guid.Empty
valoraciones y reseñas
Si para ti ha sido de provecho este post, sería de mucha ayuda si lo compartieras con otros juniors así contrubuyes a dar difusión a esta información.