filtro de ação assíncrona: Async & AuthorizeAttribute no ASP.NET WEB API

10

Eu tenho minha lógica de autenticação em uma classe, derivada de System.Web.Http.AuthorizeAttribute (método OnAuthorization substituído). Eu faço uma chamada para um banco de dados desse método e quero que essa chamada seja assíncrona (por sorte, a nova API assíncrona do ADO.NET permite isso).

Em seguida, aplico esse atributo a um controlador para que todas as chamadas passem pelo filtro de autenticação. Até aí tudo bem.

Mas, ao fazer isso, me deparo com o seguinte problema. A estrutura (ASP.NET Web API) não parece estar ciente de quais são minhas intenções :) Parece que prossegue com a execução da ação do controlador antes dos métodos OnAuthorizaion do filtro serem concluídos (retorna da chamada assíncrona). exceção do framework a la "processamento do pedido terminado antes que todas as operações assíncronas pendentes estejam completas .."

Existe alguma maneira pronta para lidar com isso?

Obrigado!

P.S. Meu instinto diz que eu estou em uma criação de filtro de ação personalizado .. Então eu preciso substituir ExecuteActionFilterAsync e fazer a minha autenticação lá lidando com todas as coisas relacionadas à Tarefa me sem ajuda do lado do quadro ..)

    
por ay.metallo 19.10.2012 в 19:03
fonte

2 respostas

5

Ok, aqui está o que eu criei (depois de dar uma espiada no capô com refletor):

public class SecurityFilterAttribute : FilterAttribute, IAuthorizationFilter
{
    public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    { 
        await OnAuthentication(actionContext);

        return actionContext.Response ?? await continuation();
    }

    private async Task OnAuthentication(HttpActionContext actionContext)
    {
         //some lengthy I/O operations (XXXAsync/await)
    }
}

Desta forma, sendo aplicado a um controlador / ação, toda a lógica será executada na ordem correta, mantendo o encadeamento desbloqueado durante a E / S. Não muito respeitoso para o cancelamento, no entanto. Mas deve estar bem para os meus propósitos ..

De qualquer forma, eu realmente me pergunto o que fez os criadores de APIs da Web não seguirem o mesmo caminho ... Ideias?

    
por ay.metallo 19.10.2012 / 23:48
fonte
0

Use IAsyncAuthorizationFilter e implemente a interface de forma assíncrona.

public async Task OnAuthorizationAsync(AuthorizationFilterContext actionContext)

    
por Guo Huang 18.10.2018 / 20:26
fonte