Personalizando a autorização no asp.net MVC

Minha class Controller é decorada com um AuthorizeAttribute para proteger as ações:

[Authorize(Roles = "User Level 2")] public class BuyController : Controller { ... } 

Sempre que uma ação é invocada, mas o usuário não está, pelo menos, na function “User Level 2”, ele é automaticamente redirecionado para a página de login com uma url como esta:

http: // localhost: 1436 / Account / Login? ReturnUrl =% 2fBuy

Se o usuário já estiver logado, mas não tiver o nível de segurança correto, esse não é um comportamento ideal! Faz mais sentido exibir uma página que informe ao usuário sobre o nível ausente, em vez de mostrar a página de login.

O que posso fazer para personalizar esse comportamento? É possível passar o nível de usuário necessário para a ação de Login de alguma forma?

Você pode criar seu próprio atributo de autorização assim:

 public class ClubAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] }, { "controller", "Account" }, { "action", "Login" }, { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } }); } } } 

Eu usei isso para redirect para um clube específico em um site de associação de clube que estou construindo. Você pode adaptar isso à sua necessidade. BTW, no meu caso eu redirect para a página de login, mas eu verifico se o usuário está autorizado e, em caso afirmativo, exibir uma mensagem que eles não têm as permissions corretas. Sem dúvida, você também pode adicionar algo para ViewData ou TempData para exibir na página, mas eu não tentei

EDIT AuthorizationContext.Cancel não existe mais no RC. “filterContext.Result é HttpUnauthorizedResult” parece ser o suficiente: O que aconteceu com filterContext.Cancel (ASP.NET MVC)

O tempo passou desde a última resposta.

Desde 2009, muito progresso foi feito no espaço de autorização. Em particular, o OASIS (os que estão por trás do SAML) padronizaram o XACML, a eXtensible Access Control Markup Language.

O XACML fornece aos desenvolvedores:

  • um padrão de uso
  • uma arquitetura
  • uma linguagem de política de autorização flexível

O XACML está alinhado ao controle de access baseado em atributos, que o NIST recomenda que seja adotado em aplicativos hoje em dia.

Dê uma olhada nesta resposta para mais detalhes.