visual tutorial tag studio proyecto net mvc crear asp asp.net-mvc asp.net-web-api asp.net-core restful-authentication asp.net-core-mvc

asp.net-mvc - tutorial - tag helpers asp net core



Cómo proteger una API web utilizando ASP.NET 5 MVC 6 (2)

Tengo una buena aplicación ASP.NET 5 / MVC 6 en funcionamiento. Esencialmente para este propósito, es solo la aplicación de ejemplo normal que obtiene cuando inicia un nuevo proyecto para mantenerlo simple. Hasta ahora puedo:

  • Registrar un usuario
  • Iniciar sesión
  • Cerrar sesión
  • Proteger una página (forzando el inicio de sesión, etc.)

Ahora, lo que me gustaría es proporcionar un mecanismo API para que una aplicación inicie sesión y obtenga un token de autenticación. Específicamente, estoy trabajando en dos aplicaciones móviles para probar, una con Angular / Cordova y otra con Xamarin.

He mirado alto y bajo y parece que todavía no puedo encontrar un ejemplo que muestre cómo hacer que esto funcione. Todos los ejemplos que encuentro hasta ahora asumen que el usuario iniciará sesión a través del formulario web / ciclo normal y luego será llevado a una página que carga Angular y este el token de autenticación ya está en el navegador.

El código relevante del archivo AccountController.cs para el controlador MVC se encuentra a continuación. Lo que en última instancia quiero es la funcionalidad equivalente, pero de una llamada de API pura que permite a Angular / Xamarin enviarle un nombre de usuario / contraseña y recuperar un token de autenticación o un error.

// POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ViewBag.ReturnUrl = returnUrl; if (ModelState.IsValid) { // This doesn''t count login failures towards account lockout // To enable password failures to trigger account lockout, set shouldLockout: true var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); if (result.Succeeded) { return RedirectToLocal(returnUrl); } if (result.RequiresTwoFactor) { return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); } if (result.IsLockedOut) { return View("Lockout"); } else { ModelState.AddModelError(string.Empty, "Invalid login attempt."); return View(model); } } // If we got this far, something failed, redisplay form return View(model); }

¿Cuál es la forma recomendada de proteger una API web utilizando ASP.NET MVC 6?


Aquí está la publicación del blog que había prometido, este es el primer borrador y sería útil para alguien que tenga alguna experiencia con ASP.NET MVC 5: Librería - API web con autorización

Fuente completa en Github: https://github.com/kbajpai/bookstore

La API con Autorización:

using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Description; using Bookstore.Models; namespace Bookstore.Controllers { public class BooksController : ApiController { private BooksDbContext db = new BooksDbContext(); // GET: api/Books [Authorize(Roles="superuser,user")] public IQueryable<Book> GetBooks() { return db.Books; } // GET: api/Books/5 [ResponseType(typeof(Book))] [Authorize(Roles = "superuser,user")] public async Task<IHttpActionResult> GetBook(string id) { Book book = await db.Books.FindAsync(id); if (book == null) { return NotFound(); } return Ok(book); } // PUT: api/Books/5 [ResponseType(typeof(void))] [Authorize(Roles = "superuser")] public async Task<IHttpActionResult> PutBook(string id, Book book) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != book.Id) { return BadRequest(); } db.Entry(book).State = EntityState.Modified; try { await db.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!BookExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); } // POST: api/Books [Authorize(Roles = "superuser")] [ResponseType(typeof(Book))] public async Task<IHttpActionResult> PostBook(Book book) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Books.Add(book); try { await db.SaveChangesAsync(); } catch (DbUpdateException) { if (BookExists(book.Id)) { return Conflict(); } else { throw; } } return CreatedAtRoute("DefaultApi", new { id = book.Id }, book); } // DELETE: api/Books/5 [Authorize(Roles = "superuser")] [ResponseType(typeof(Book))] public async Task<IHttpActionResult> DeleteBook(string id) { Book book = await db.Books.FindAsync(id); if (book == null) { return NotFound(); } db.Books.Remove(book); await db.SaveChangesAsync(); return Ok(book); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } private bool BookExists(string id) { return db.Books.Count(e => e.Id == id) > 0; } } }


Creo que el enfoque recomendado para asegurar WebApi2 es a través de un Servidor de Autorización. El Servidor de Autorizaciones se encarga de generar tokens. Pero en base a this , el servidor de autorización basado en OAuth2 que forma parte de Katana3 se ha eliminado de Asp.Net 5.

Supongo que su aplicación aún no es una aplicación en vivo, ya que ASP.NET 5 y MVC 6 aún no están en su etapa final de lanzamiento. Por lo tanto, si está de acuerdo en cambiar su proceso de identidad / autenticación, puede usar IdentityServer3 de Thinktecture.

Dominick Baier ha escrito en su blog sobre El estado de la seguridad en ASP.NET 5 y MVC 6 y en donde IdSvr3 aparece en la imagen. Ese blog tiene un enlace a un repositorio Github para el controlador API de muestra, y también un cliente API. También tiene muestra para una aplicación web MVC. Y puede funcionar con Asp.Net Identity.

ACTUALIZAR:

Si eso no funciona para usted, puede probar AspNet.Security.OpenIdConnect.Server . Tenga en cuenta que tiene problemas abiertos en Github, por lo que puede encontrar problemas al usarlo. Tenga en cuenta también sus dependencias, en particular el azureadwebstack nightly .

Tenga en cuenta que ASP.NET 5 y MVC 6 pueden estar en una versión beta estable, pero aún están en versión beta . Todavía podría cambiar.

Además, IdSvr3 v2.0 puede estar en su versión final, pero es desarrollado por un equipo separado. Y solo se lanzó hace 2 semanas, por lo que, en mi humilde opinión, como en la mayoría de los programas, es posible encontrar cosas que probablemente no hayan superado sus pruebas. Tenga en cuenta que el equipo de ASP.NET , la semana pasada, tweeted sobre la versión de IdSvr3 (v2.0), por lo que parece que lo están respaldando.