usuarios - Autenticación de usuario en ASP.NET Web API
obtener el usuario logueado asp.net mvc (3)
Me sorprende cómo no he podido encontrar un ejemplo claro de cómo autenticar a un usuario directamente desde la pantalla de inicio de sesión hasta usar el atributo Autorizar sobre mis métodos ApiController después de varias horas de búsqueda en Google.
Eso es porque te confundes con estos dos conceptos:
La autenticación es el mecanismo mediante el cual los sistemas pueden identificar de forma segura a sus usuarios. Los sistemas de autenticación brindan respuestas a las preguntas:
- ¿Quién es el usuario?
- ¿Es realmente el usuario quien se representa a sí mismo?
La autorización es el mecanismo por el cual un sistema determina qué nivel de acceso debe tener un usuario autenticado particular a los recursos asegurados controlados por el sistema. Por ejemplo, un sistema de gestión de bases de datos puede diseñarse para proporcionar a ciertas personas específicas la capacidad de recuperar información de una base de datos pero no la capacidad de cambiar los datos almacenados en la base de datos, mientras les da a otras personas la capacidad de cambiar los datos. Los sistemas de autorización brindan respuestas a las preguntas:
- ¿Está autorizado el usuario X para acceder al recurso R?
- ¿El usuario X está autorizado para realizar la operación P?
- ¿Está autorizado el usuario X para realizar la operación P en el recurso R?
El atributo Authorize
en MVC se usa para aplicar reglas de acceso, por ejemplo:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
La regla anterior permitirá que solo los usuarios en las funciones Admin y Superusuario accedan al método
Estas reglas también se pueden establecer en el archivo web.config, utilizando el elemento de location
. Ejemplo:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Sin embargo, antes de que se ejecuten esas reglas de autorización, debe estar autenticado en el sitio web actual .
Aunque estos explican cómo manejar las solicitudes no autorizadas, estas no demuestran claramente algo así como un LoginController o algo así para pedir credenciales de usuario y validarlas.
A partir de aquí, podríamos dividir el problema en dos:
Autentica a los usuarios cuando consumen los servicios de API web dentro de la misma aplicación web
Este sería el enfoque más simple, porque confiaría en la Autenticación en ASP.Net
Este es un ejemplo simple:
Web.config
<authentication mode="Forms"> <forms protection="All" slidingExpiration="true" loginUrl="account/login" cookieless="UseCookies" enableCrossAppRedirects="false" name="cookieName" /> </authentication>
Los usuarios serán redirigidos a la ruta de cuenta / inicio de sesión , allí usted renderizaría controles personalizados para solicitar credenciales de usuario y luego establecería la cookie de autenticación usando:
if (ModelState.IsValid) { if (Membership.ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); return RedirectToAction("Index", "Home"); } else { ModelState.AddModelError("", "The user name or password provided is incorrect."); } } // If we got this far, something failed, redisplay form return View(model);
Autenticación multiplataforma
Este caso sería cuando solo está exponiendo servicios Web API dentro de la aplicación web, por lo tanto, tendría otro cliente consumiendo los servicios, el cliente podría ser otra aplicación web o cualquier aplicación .Net (Win Forms, WPF, consola, servicio de Windows, etc)
Supongamos, por ejemplo, que consumirá el servicio API web de otra aplicación web en el mismo dominio de red (dentro de una intranet), en este caso puede confiar en la autenticación de Windows proporcionada por ASP.Net.
<authentication mode="Windows" />
Si sus servicios están expuestos en Internet, deberá pasar los tokens autenticados a cada servicio de API web.
Para obtener más información, lleve un botín a los siguientes artículos:
Este tema ha sido increíblemente confuso para mí. Soy un novato en aplicaciones HTTP, pero necesito desarrollar un cliente de iPhone que consuma datos JSON de algún lugar. Elegí Web API de MS porque parecía bastante fácil, pero cuando se trata de autenticar usuarios, las cosas se vuelven bastante frustrantes.
Me sorprende cómo no he podido encontrar un ejemplo claro de cómo autenticar a un usuario directamente desde la pantalla de inicio de sesión hasta usar el atributo Authorize
sobre mis métodos ApiController
después de varias horas de ApiController
Google.
Esta no es una pregunta sino una solicitud de un ejemplo de cómo hacer esto exactamente. He visto las siguientes páginas:
Aunque estos explican cómo manejar las solicitudes no autorizadas, estas no demuestran claramente algo así como un LoginController
o algo así para pedir credenciales de usuario y validarlas.
¿Alguien dispuesto a escribir un buen ejemplo simple o señalarme en la dirección correcta, por favor?
Gracias.
Estoy trabajando en un proyecto MVC5 / Web API y necesitaba poder obtener la autorización para los métodos Web Api. Cuando mi vista de índice se carga por primera vez hago una llamada al método de la API web ''token'' que creo que se crea automáticamente.
El código del lado del cliente (CoffeeScript) para obtener el token es:
getAuthenticationToken = (username, password) ->
dataToSend = "username=" + username + "&password=" + password
dataToSend += "&grant_type=password"
$.post("/token", dataToSend).success saveAccessToken
Si tiene éxito, se llama a lo siguiente, que guarda el token de autenticación localmente:
saveAccessToken = (response) ->
window.authenticationToken = response.access_token
Entonces, si necesito hacer una llamada Ajax a un método de API web que tiene la etiqueta [Autorizar] simplemente agrego el siguiente encabezado a mi llamada Ajax:
{ "Authorization": "Bearer " + window.authenticationToken }
Si desea autenticarse contra un nombre de usuario y contraseña y sin una cookie de autorización , el atributo Authorize MVC4 no funcionará de la caja. Sin embargo, puede agregar el siguiente método de ayuda a su controlador para aceptar encabezados de autenticación básica. Llámalo desde el comienzo de los métodos de tu controlador.
void EnsureAuthenticated(string role)
{
string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split('':'');
if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
if (role != null && !Roles.IsUserInRole(parts[0], role))
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}
Desde el lado del cliente, este ayudante crea un HttpClient
con el encabezado de autenticación en su lugar:
static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + '':'' + password)));
return client;
}