OWIN OAuth中的Application_PostAuthenticateRequest等效项

时间:2018-12-12 16:31:28

标签: asp.net-mvc asp.net-web-api oauth owin

为了使我的服务层能够在需要时随时访问当前用户ID,我使用Thread.CurrentPrincipal。

服务层由两个前端层使用,一个MVC应用程序和一个MVC Web Api用于移动应用程序。

在Web应用程序中,我使用表单身份验证,并且主体设置为Application_PostAuthenticateRequest。很好。

在网络Api中,我使用Owin。但是,在使用访问令牌对每个请求进行身份验证之后,我都找不到一种方法来设置主体。

当用户通过将GrantResourceOwnerCredentials覆盖我的OAuthAuthorizationServerProvider来使用其凭据登录时,或者当他通过覆盖同一类中的GrantRefreshToken来使用其刷新令牌登录时,我可以做到这一点。 / p>

但是我可以在哪里为使用访问令牌自动认证的请求分配它呢?

NB。我知道在Api控制器中我可以访问当前用户,并且已正确设置了该用户,但是我不想在每次调用时将其传递给服务层。

谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了设置方法。

OAuthAuthorizationServerProvider不完成承载验证。我必须实现自定义OAuthBearerAuthenticationProvider,并重写ValidateIdentity方法:

public class MyBearerAuthenticationProvider : OAuthBearerAuthenticationProvider
{
    public override Task ValidateIdentity(OAuthValidateIdentityContext context)
    {
        Thread.CurrentPrincipal = new Principal(context.Ticket.Identity);
        return base.ValidateIdentity(context);
    }
}

然后使用以下方式将该提供程序插入我的应用程序:

OAuthBearerAuthenticationOptions bearerAuthenticationOptions = new OAuthBearerAuthenticationOptions()
{
    Provider = new MyBearerAuthenticationProvider()
};
app.UseOAuthBearerAuthentication(bearerAuthenticationOptions);

不幸的是,在我的业务层中Thread.CurrentPrincipal为null。我假设令牌验证是在请求执行之外的另一个线程中完成的。所以我必须更改我的方法。