none
Autorizar con claims en MVC 5

    Pregunta

  • Hola, he estado buscando una forma de aplicar claims en los controladores y asi limitar el acceso a ellos. Algo asi como el [Authorize] para los roles. Sé MVC core existe [Authorize(Policy=)] el cual funciona como quiero pero no encuentro una forma de hacer lo mismo en MVC 5.

    Saludos y gracias

    miércoles, 06 de junio de 2018 21:35

Respuestas

  • Un ejemplo de configuración es

    <system.web>
        <authentication mode="Forms">
          <forms name="prueba" cookieless="UseCookies" protection="All" />
        </authentication>
    </system.web>

    Y un ejemplo de establecer el ticket

    public static void AddUserToSession(string id)
    {
        bool persist = true;
        // generar cookie de autenticación
        FormsAuthentication.SetAuthCookie(id, persist);
        var cookie = FormsAuthentication.GetAuthCookie(id, persist);
    
        cookie.Name = FormsAuthentication.FormsCookieName;
        cookie.Expires = DateTime.Now.AddMonths(3);
    
        var ticket = FormsAuthentication.Decrypt(cookie.Value);
        var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, id);
    
        cookie.Value = FormsAuthentication.Encrypt(newTicket);
        HttpContext.Current.Response.Cookies.Add(cookie);
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Erick Salazar miércoles, 13 de junio de 2018 3:31
    jueves, 07 de junio de 2018 6:10
    Moderador

Todas las respuestas

  • Hola. Puedes crearte un atributo personalizado que derive del Authorize, en dicho atributo se validan las claims.

    public class ClaimsAuthorizeAttribute : AuthorizeAttribute
    {
        private string claimType;
        private string claimValue;
        public ClaimsAuthorizeAttribute(string type, string value)
        {
            this.claimType = type;
            this.claimValue = value;
        }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var user = filterContext.HttpContext.User as ClaimsPrincipal;
            if (user != null && user.HasClaim(claimType, claimValue))
            {
                base.OnAuthorization(filterContext);
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }
    }
    


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta webJose miércoles, 06 de junio de 2018 23:28
    miércoles, 06 de junio de 2018 21:59
    Moderador
  • También puedes revisar este enlace.

    Using Claims-based Authorization in MVC and Web API


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 06 de junio de 2018 22:01
    Moderador
  • Hola Sergio gracias por tu respuesta. Otra consulta: Agregué unas claims en una app de consola y cuando utilizo 

    Thread.CurrentPrincipal.Identity.IsAuthenticated

    me retorna true, pero cuando hago lo mismo en una app MVC y utilizo

    User.Identity.IsAuthenticated

    me retorna false, será que estoy pasando las claims mal ? lo hice asi:

    ICollection<Claim> claims = new Collection<Claim>()
                {
                    //claims
                };
    
    ClaimsIdentity identity = new ClaimsIdentity(claims, "Issuer");
    
    ClaimsPrincipal principal = new ClaimsPrincipal(identity);
    
    HttpContext.User = principal;
    Thread.CurrentPrincipal = principal;

    Lo que quiero es entender como funciona esto antes de utilizar Identity

    Muchas gracias

    miércoles, 06 de junio de 2018 22:17
  • Para usar Identity debes establecer una configuración en el web.config. puedes proporcionarlo? Hay que habilitar un modo de autenticación, setear una cookie de autenticación al establecer el login.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 07 de junio de 2018 6:03
    Moderador
  • Un ejemplo de configuración es

    <system.web>
        <authentication mode="Forms">
          <forms name="prueba" cookieless="UseCookies" protection="All" />
        </authentication>
    </system.web>

    Y un ejemplo de establecer el ticket

    public static void AddUserToSession(string id)
    {
        bool persist = true;
        // generar cookie de autenticación
        FormsAuthentication.SetAuthCookie(id, persist);
        var cookie = FormsAuthentication.GetAuthCookie(id, persist);
    
        cookie.Name = FormsAuthentication.FormsCookieName;
        cookie.Expires = DateTime.Now.AddMonths(3);
    
        var ticket = FormsAuthentication.Decrypt(cookie.Value);
        var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, id);
    
        cookie.Value = FormsAuthentication.Encrypt(newTicket);
        HttpContext.Current.Response.Cookies.Add(cookie);
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Erick Salazar miércoles, 13 de junio de 2018 3:31
    jueves, 07 de junio de 2018 6:10
    Moderador