为了使我的服务层能够在需要时随时访问当前用户ID,我使用Thread.CurrentPrincipal。
服务层由两个前端层使用,一个MVC应用程序和一个MVC Web Api用于移动应用程序。
在Web应用程序中,我使用表单身份验证,并且主体设置为Application_PostAuthenticateRequest
。很好。
在网络Api中,我使用Owin。但是,在使用访问令牌对每个请求进行身份验证之后,我都找不到一种方法来设置主体。
当用户通过将GrantResourceOwnerCredentials
覆盖我的OAuthAuthorizationServerProvider
来使用其凭据登录时,或者当他通过覆盖同一类中的GrantRefreshToken
来使用其刷新令牌登录时,我可以做到这一点。 / p>
但是我可以在哪里为使用访问令牌自动认证的请求分配它呢?
NB。我知道在Api控制器中我可以访问当前用户,并且已正确设置了该用户,但是我不想在每次调用时将其传递给服务层。
谢谢。
答案 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。我假设令牌验证是在请求执行之外的另一个线程中完成的。所以我必须更改我的方法。