Pergunta

Fiz um novo filtro de ação (atributo, semelhante a [Authorize]) que autoriza o acesso a uma ação do controlador com base em um valor de sessão. No entanto, estou basicamente decorando todas as minhas ações controladoras com esse atributo (com exceção de muito poucos).

Então, eu pensei que seria melhor ter esse filtro de ação sempre executado exceto Nos casos em que eu anexo um atributo [isempfromeuthorize] a uma ação do controlador? (Talvez via herdando para minha própria classe de controlador?)

Como posso fazer isso?

Foi útil?

Solução

Correndo com jeef3Resposta, eu inventei isso. Pode usar mais verificação de erros e robustez como várias ações delimitadas, mas a ideia geral funciona.

No seu caso específico, você pode testar o valor da sessão e decidir retornar da autorização também.

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
    public string Exemption { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.RouteData.GetRequiredString("action") == Exemption)
            return;

        base.OnAuthorization(filterContext);
    }

}

Uso:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...

Outras dicas

Confira meu artigo no CodeProject -

http://www.codeproject.com/kb/web-security/authorizewithExemptions.aspx

Neste artigo, fornecerei uma solução para proteger os controladores do aplicativo ASP.NET MVC de uma maneira que todas as ações sejam protegidas, exceto aquelas que você define como insegura.

Snipper do código:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ActionDescriptor action = filterContext.ActionDescriptor;
    bool IsUnsecured = action.GetCustomAttributes(
                         typeof(UnsecuredActionAttribute), true).Count() > 0;

    //If doesn't have UnsecuredActionAttribute - then do the authorization
    filterContext.HttpContext.SkipAuthorization = IsUnsecured;

    base.OnAuthorization(filterContext);
}

Entendo que a pergunta está bastante desatualizada, mas de qualquer maneira ... se você deseja aplicar o filtro a todas as ações, basta adicionar as seguintes linhas ao global.ASAX:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

E no filtro de ação, você pode apenas verificar se a ação tem outros atributos da seguinte maneira:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}

Talvez tente adicionar um Except propriedade para o seu primeiro atributo?

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}

Você pode adicionar o atributo à classe para que ele se aplique a todos os métodos nessa classe

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Não sei como excluir um método específico de um atributo de nível de classe. Talvez use um controlador separado para solicitações não autenticadas?

Para quem está lendo isso em 2013+, o MVC4 agora suporta o uso de [allowanonymous

Você pode colocar autorizar no controlador e, em seguida, permitir que o Anonymous em quaisquer funções que não deseja autorizar.

Exemplo:

Autorize] Classe Public Homecontroller: Controller {

[AllowAnonymous]
public ActionResult Index()
{

} 

}

Isso funcionaria com um filtro personalizado [MyAuthorize] ou só funciona com [Autorizar

Para quem está lendo isso em 2013+, o MVC4 agora suporta o uso de [AllowAnonymous]

Você pode colocar autorizar no controlador e, em seguida, permitir que o Anonymous em quaisquer funções que não deseja autorizar.

Exemplo:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top