Eu gostaria de adicionar autorização a um controlador, para várias funções de uma vez.
Normalmente seria assim:
[Authorize(Roles = "RoleA,RoleB,RoleC")]
public async Task<ActionResult> Index()
{
}
Mas eu armazenei minhas funções em constantes, uma vez que elas podem mudar ou ser estendidas em algum ponto.
public const RoleA = "RoleA";
public const RoleB = "RoleB";
public const RoleC = "RoleC";
Não posso fazer isso, pois a string deve ser conhecida no momento da compilação:
[Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)]
public async Task<ActionResult> Index()
{
}
Existe uma maneira de contornar o problema?
PODERIA escrever uma const que simplesmente contenha "RoleA, RoleB, RoleC" - mas não gosto de strings mágicas e esta é uma string mágica. Mudar o nome de uma função e esquecer de mudar a string combinada seria um desastre.
Estou usando MVC5. A identidade e a função do ASP.NET são conhecidas em tempo de compilação.
c#
asp.net-mvc
authorization
Christian Sauer
fonte
fonte
Respostas:
Tente criar um atributo de autorização personalizado como este .
Assumindo que suas funções serão as mesmas para vários controladores, crie uma classe auxiliar:
Em seguida, use-o assim:
fonte
Certifique-se de que você está derivando sua classe de atributo customizado
System.Web.Mvc.AuthorizeAttribute
e NÃOSystem.Web.Http.AuthorizeAttribute
.Eu tive o mesmo problema. Depois que mudei, tudo funcionou.
Você também pode querer adicionar o seguinte à sua classe de atributo personalizado:
fonte
System.Web.Http.AuthorizeAttribute
INSTEAD OFSystem.Web.Mvc.AuthorizeAttribute
A melhor e mais simples maneira que encontrei de resolver esse problema é apenas concatenar funções no atributo Autorizar.
com CustomRole uma classe com strings constantes como esta:
fonte
O que fiz foi a resposta em @Tieson
Eu ajeito um pouco em sua resposta. Em vez de string.Join, por que não convertê-lo em lista?
Aqui está minha resposta:
Em seguida, verifique se a função é válida, substituindo OnAuthorization
E aí está, agora está validando se a função está autorizada a acessar o recurso
fonte
Acho que um atributo de autorização personalizado é um exagero para esse problema, a menos que você tenha uma grande quantidade de funções.
Visto que a string deve ser conhecida no momento da compilação, por que não criar uma classe Role estática que contenha strings públicas das funções que você definiu e, em seguida, adicionar strings separadas por vírgulas com certas funções que você deseja autorizar:
E então você pode usar o Atributo de Autorização da mesma forma que na Classe do Controlador ou no Método do Controlador (ou ambos):
fonte
ADMIN_OR_VIEWER
papel na ação é redundante porque você não terá permissão para acessar oCreate
método se ainda não tiver oADMIN
papel. Nesse casoVIEWER
, nunca será possível invocar oCreate
método.