asp.net - visual - usuarios roles y permisos c# mvc




Autenticación de usuario en ASP.NET Web API (2)

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 }




asp.net-web-api