Pergunta

Eu me perguntei se/como posso substituir o comportamento padrão [Autorize] no ASP.NET MVC. Sei que posso criar um novo filtro de ação, fazer meu próprio atributo e assim por diante; Estou apenas interessado se posso simplesmente alterar o comportamento [autorizado] e substituir seu funcionamento pelo meu próprio código?

Editar: Rapazes e garotas. Agradeço sua opinião, mas como escrevi, estou não Procurando apresentar um novo atributo [xyzauthorize]. Estou ciente de como fazer isso. Quero manter a notação [autorizada], mas apenas mude a forma como ela funciona.

Foi útil?

Solução

Sim, dê uma olhada no MSDN Docs for Autorizeattribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.

Basicamente, você pode substituir o método ONAuthorization () e personalizar o comportamento. Existem outros métodos virtuais no atributo também.

EDIT: Como Bruno apontou, você pode substituir o método Autorizecore (). A principal diferença é que o autorizecore () pega uma httpcontextbase, enquanto o ONAuthorization () pega uma autorizationContext. Uma instância do AuthorizationContext fornece mais informações, como o controlador, o requestContext e o rotedata. Ele também permite especificar um ActionResult.

Authorizecore () é mais restrito nas informações que você pode acessar, bem como o resultado, você pode retornar, mas se você precisar autorizar dados em cache, sua lógica precisa lidar com o caso em que você não possui nenhum desses dados extras ( Como os dados são servidos no cache antes da solicitação ser roteada através do pipeline do MVC).

Como sempre, você precisa entender seu cenário e as ferramentas e trocas disponíveis entre eles.

Outras dicas

Você pode subclasse o filtro Autorizeattribute e colocar sua própria lógica dentro dele.

Vamos ver um exemplo. Digamos que você queira sempre autorizar conexões locais. No entanto, se for uma conexão remota, você gostaria de manter a lógica de autorização usual.

Você poderia fazer algo como:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

Ou você sempre pode autorizar um determinado endereço remoto (sua máquina, por exemplo).

É isso!

EDIT: Esqueci de mencionar, você o usará da mesma forma que usaria o filtro Autorizeattribute:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

Implemente seu próprio provedor de função e defina seu aplicativo para usá -lo. Em seguida, o atributo Authorize respeitará seu código de atorização.

Eu vejo apenas 2 maneiras: substituindo AuthorizeAttribute.OnAuthorization Método ou criação de seu próprio atributo Authorize a partir do zero.

1) Muito fácil:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) Fácil também - basta olhar para a fonte do ASP.NET MVC, Autorizeattribute.cs Arquivo

Parece que você pode implementar um filtro personalizado como de costume (e herdar o Autorizeattribute, se quiser) e depois criar um novo ActionInvoker que herda ControllerActionInVoker e substitui o GetFilters. Em getfilters, você liga base.GetFilters() Para obter a lista de filtros, o iterar através dos filtros de autorização e substitua as chamadas para autorizar o Filter por chamadas para o seu filtro personalizado.

Outra maneira potencial é implementar provedores de associação e função personalizados, dependendo do que você está tentando fazer.

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