net mvc example crear asp c# asp.net-mvc authentication asp.net-core openid-connect

c# - crear - mvc authentication example



Autenticación de aplicaciones y usuarios utilizando ASP.NET Core (5)

Aquí está: Un taller para moverse a través de varias piezas nuevas en ASP.NET Core Authorization:

https://blogs.msdn.microsoft.com/webdev/2016/03/15/get-started-with-asp-net-core-authorization-part-1-of-2/

https://github.com/blowdart/AspNetAuthorizationWorkshop

¿Alguien puede indicarme alguna buena documentación o proporcionar buena información sobre la mejor manera de implementar autenticación y autorización para una API REST principal de ASP.NET? Primero necesito autenticar y autorizar la aplicación y luego autenticar y autorizar al usuario.

Idealmente, quiero poder restringir el método de control al que puede acceder una aplicación y / o usuario autenticado.

Estoy pensando en utilizar AspNet.Security.OpenIdConnect.Serverenter para la autenticación de la aplicación, pero no estoy seguro de cómo realizar la autenticación del usuario. Tal vez reutilice la autenticación OpenIdConnect en un punto final diferente para que los usuarios con un encabezado diferente puedan contener el token de usuario.

Una vez autenticado, estoy pensando en utilizar solo la seguridad de la base de roles para restringir a qué métodos de control se puede acceder.

¿Es esta la ruta correcta para resolver este problema?


Esta es en realidad una pregunta más difícil que puede parecer porque el tipo de clientes (clientes de software) que están utilizando la API parecen impulsar qué tipo de auth * se necesita. Por ejemplo, en una aplicación web, donde la aplicación web necesita auth *, entonces Asp.Net Identity funcionaría con un token o una cookie. Sin embargo, si otros clientes van a consumir los servicios proporcionados (aplicaciones móviles, aplicaciones WUP, entonces puede ser más fácil de implementar mediante la autenticación de tokens. Cuando tuve este problema, me encontré con el problema de que tenía una brecha de conocimiento porque no lo hice Realmente entiendo a OAuth. Tuve que volver a lo básico.

https://alexbilbie.com/guide-to-oauth-2-grants/

https://www.pluralsight.com/courses/oauth2-json-web-tokens-openid-connect-introduction

La mayoría de los tutoriales sobre Asp.Net Identity "Seem" están orientados a clientes web. Aunque es posible encontrar aquellos que no lo son. Con la introducción de asp.net core, la sintaxis ha cambiado y muchos de los antiguos tutoriales que muestran la combinación de cookies y autenticación de tokens ya no son aplicables. Además, Web Api ya no está separado de otros tipos de proyectos en Visual Studio, lo que hace que el cambio sea aún más pronunciado. Aquí hay algunos tutoriales más antiguos.

http://satvasolutions.com/combine-asp-net-identity-web-api-and-mvc-best-in-a-single-web-app/

http://blog.iteedee.com/2014/03/asp-net-identity-2-0-cookie-token-authentication/

¿Combina el uso de autenticación tanto para páginas MVC como para páginas de API web?

IdentityServer es una solución completamente válida, funciona tanto con la credencial del cliente como con las credenciales del propietario del recurso (usuario, contraseña) y Brock Allen generalmente ha sido muy receptivo en SO bajo la etiqueta

https://.com/questions/tagged/identityserver4

o en el sitio de github bajo problemas etiquetados como preguntas

https://github.com/IdentityServer/IdentityServer4/issues

Con el servidor de identidad, una vez más, tuve que volver a lo básico y trabajar en los tutoriales para entender cómo funcionaría esto en mi proyecto.

https://identityserver4.readthedocs.io/en/release/intro/big_picture.html

Como Brock rápidamente me señaló en otra publicación, la identidad de asp.net ef es una tienda de usuario y es buena para utilizar con el flujo de trabajo de credenciales del propietario del recurso.


No pude encontrar ninguna buena documentación sobre esto, sin embargo tuve que lograr lo mismo, así que codifiqué el resto de la API modificando las acciones en la plantilla de autenticación estándar de ASP.NET para REST API equivalentes.

Por ejemplo, aquí es cómo trabajé la acción de inicio de sesión:

// POST: /Account/Login [HttpPost("[action]")] [AllowAnonymous] public async Task<ReturnValue<ApplicationUser>> Login([FromBody] loginModel login) { if (ModelState.IsValid) { ApplicationUser user = await _userManager.FindByEmailAsync(login.email); if (user == null) { return new ReturnValue<ApplicationUser>(false, "Login failed, check username and password.", null); } // else if (user.EmailConfirmed == false) // { // return new ReturnValue<ApplicationUser>(true, "Confirm email address.", null, user); // } else { // This doesn''t count login failures towards account lockout // To enable password failures to trigger account lockout, set lockoutOnFailure: true var result = await _signInManager.PasswordSignInAsync(user, login.password, (bool)login.rememberMe, lockoutOnFailure: false); if (result.Succeeded) { return new ReturnValue<ApplicationUser>(true, user); } //if (result.RequiresTwoFactor) //{ // return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); //} if (result.IsLockedOut) { return new ReturnValue<ApplicationUser>(false, "The account is locked out.", null); } } } else { string message = string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage)); return new ReturnValue<ApplicationUser>(false, "Invalid login attempt: " + message, null); } // If we got this far, something failed in the model. return new ReturnValue<ApplicationUser>(false, "Login failed.", null); }

Si llama a la API desde un javascript dentro de un navegador, las cookies se cargarán y podrá realizar más llamadas autorizadas a la API; si llama desde otro tipo de cliente, querrá asegurarse de que se retenga el CookieContainer. para llamadas autorizadas

A partir de este punto, puede autorizar los controladores de su API REST utilizando el decodificador [Authorize] a través de las bibliotecas estándar de Microsoft: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

Buena suerte.