148 votos

La Autenticación de usuario en ASP.NET Web API

Este tema ha sido muy confuso para mí. Yo soy un novato en HTTP apps, pero tienen que desarrollar un iPhone cliente que consume datos JSON desde algún lugar. Elegí Web de la API de MS porque parecía bastante fácil, pero cuando se trata de la autenticación de usuarios, las cosas se ponen bastante frustrante.

Me sorprende cómo no he sido capaz de encontrar un claro ejemplo de cómo autenticar a un usuario desde la pantalla de inicio de sesión a uso de la Authorize atributo más de la mi ApiController métodos después de varias horas de búsqueda en Google.

Esta no es una pregunta sino una solicitud para un ejemplo de cómo hacerlo exactamente. He mirado en las páginas siguientes:

Aunque estos explicar cómo manejar las solicitudes no autorizadas, estas no demuestran claramente algo como un LoginController o algo así que a pedir credenciales de usuario y validar.

Cualquiera que esté dispuesto a escribir un buen ejemplo sencillo o me apunte en la dirección correcta, por favor?

Gracias.

177voto

Jupaol Puntos 12825

Me sorprende cómo no he sido capaz de encontrar un claro ejemplo de cómo autenticar a un usuario desde la pantalla de inicio de sesión a uso de la Autorizar atributo a través de mi ApiController métodos después de varias horas de búsqueda en Google.

Eso es porque usted se confundan acerca de estos dos conceptos:

  • La autenticación es el mecanismo por el cual los sistemas pueden identificar de forma segura a sus usuarios. Sistemas de autenticación de proporcionar una respuesta a las preguntas:

    • ¿Quién es el usuario?
    • Se el usuario realmente que él/ella representa a sí mismo?
  • La autorización es el mecanismo por el cual un sistema determina qué nivel de acceso de un determinado usuario autenticado deben tener garantizados los recursos controlados por el sistema. Por ejemplo, un sistema de gestión de base puede ser diseñada de modo que proporcione determinados individuos con la capacidad para recuperar información de una base de datos pero no la capacidad de cambiar los datos almacenados en la base de datos, mientras que dar a otras personas la capacidad para cambiar los datos. Los sistemas de autorización de proporcionar respuestas a las preguntas:

    • Es usuario X autorizados para el acceso de recursos de R?
    • Es usuario X autorizados para realizar la operación P?
    • Es usuario X autorizados para realizar la operación P en el recurso R?

La Authorize de atributo en MVC se utiliza para aplicar las reglas de acceso, por ejemplo:

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

La regla anterior sólo permitirá a los usuarios en el Administrador y Súper Usuario de funciones para acceder al método

Estas reglas también se pueden establecer en la web.archivo de configuración, utilizando el location elemento. Ejemplo:

  <location path="Home/AdministratorsOnly">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

Sin embargo, antes de que esas reglas de autorización se ejecutan, tienes que estar autentificado en el sitio web actual.

Aunque estos explicar cómo manejar las solicitudes no autorizadas, estas no demuestran claramente algo como un LoginController o algo por el estilo para pedir credenciales de usuario y validar.

A partir de aquí, podríamos dividir el problema en dos:

  • Autenticar a los usuarios a la hora de consumir el Web de la API de servicios dentro de la misma aplicación Web

    Este sería el enfoque más sencillo, ya que se basan en la Autenticación en ASP.Net

    Este es un simple ejemplo:

    De la Web.config

    <authentication mode="Forms">
      <forms
        protection="All"
        slidingExpiration="true"
        loginUrl="account/login"
        cookieless="UseCookies"
        enableCrossAppRedirects="false"
        name="cookieName"
      />
    </authentication>
    

    Los usuarios serán redireccionados a la cuenta/login de la ruta, allí se haría controles personalizados para pedir credenciales de usuario y, a continuación, establezca la cookie de autenticación mediante:

        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);
    
  • De la cruz - plataforma de autenticación

    En este caso sería cuando son sólo exponer la API de Web services dentro de la aplicación Web por lo tanto, usted tendría otro cliente de consumo de los servicios, el cliente podría ser de otra aplicación Web o de cualquiera .Neto de la aplicación (Windows Forms, WPF, consola, servicio de Windows, etc.)

    Por ejemplo, suponga que usted va a estar consumiendo la API Web service desde otra aplicación web en el mismo dominio de red (dentro de una intranet), en este caso, usted puede confiar en la autenticación de Windows proporcionada por ASP.Net.

    <authentication mode="Windows" />
    

    Si sus servicios están expuestos en Internet, entonces usted necesita para pasar la autenticado fichas para cada API Web service.

    Para más información, echa un botín para los siguientes artículos:

15voto

Edward Brey Puntos 8771

Si desea autenticar contra un nombre de usuario y la contraseña y sin autorización de la galleta, el MVC4 Autorizar el atributo de no trabajar fuera de la caja. Sin embargo, puede agregar la siguiente método auxiliar para su controlador a aceptar la autenticación básica encabezados. Llamar desde el comienzo de su controlador de métodos.

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 helper se crea un HttpClient con el encabezado de autenticación en lugar de:

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;
}

9voto

ProfNimrod Puntos 746

Estoy trabajando en un MVC5/Web de la API de proyecto y necesita ser capaz de obtener la autorización para la Web de métodos de la Api. Cuando mi vista de índice se carga por primera vez hago una llamada a los 'token' de la Web de la API método que yo creo que es creado automáticamente.

El lado del cliente código (CoffeeScript) para obtener el token:

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

Si tiene éxito, el siguiente se llama, que guarda el token de autenticación local:

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

Entonces, si necesito hacer una llamada Ajax a una Web API método que tiene el [Authorize] etiqueta me basta con añadir el siguiente encabezado a mi llamada de Ajax:

{ "Authorization": "Bearer " + window.authenticationToken }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X