Pergunta

Estou tentando adicionar autorização aos meus controladores e não está funcionando ...

Não tenho certeza de onde procurar no meu programa, mas adicionando o

[Authorize] 

filtrar no meu controlador não está funcionando, muito menos nada como

[Authorize(Roles = "Manager")]

Consegui fazer isso funcionar no aplicativo padrão fornecido ao criar um novo projeto MVC (ou seja, sou capaz de fazer a guia "Sobre" redirecionar para a tela de login se não estiver conectado), então eu Suponha que eu tenha estragado as coisas ao longo do caminho quando construí meu aplicativo. Alguém sabe onde eu deveria estar procurando consertar isso? Eu tenho usuários e eles têm papéis; Estou usando o esquema ASP.NET que é criado automaticamente; Examinei meu arquivo web.config para cima e para baixo e, embora eu seja muito novo nisso, nada parece estar fora do lugar. Não tenho idéia de por que meus filtros de autorização não estão funcionando.?.

Foi útil?

Solução

Eu escrevi um atributo personalizado para resolver esse problema. Você pode atribuir seus métodos de controlador da seguinte forma:

[RequiresRole(Role="Admin")]
public ActionResult Index()
{
    int i = 5 + 5;

    return View();
}

O código do atributo é o seguinte ....

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Web.Controllers
{
    public class RequiresRoleAttribute : ActionFilterAttribute
    {
        public string Role { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (string.IsNullOrEmpty(Role))
            {
                throw new InvalidOperationException("No role specified.");
            }

            string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
            string redirectUrl = string.Format("?returnUrl={0}", redirectOnSuccess);
            string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;

            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
            else
            {
                bool isAuthorised = filterContext.HttpContext.User.IsInRole(this.Role);
                if (!isAuthorised)
                {                        
                    filterContext.HttpContext.Response.Redirect(loginUrl, true);
                }                
            }  
        }      
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top