【问题标题】:Application_PostAuthenticateRequest equivalent in OWIN OAuthOWIN OAuth 中的 Application_PostAuthenticateRequest 等效项
【发布时间】:2019-05-13 19:35:22
【问题描述】:

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

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

在 Web 应用程序中,我使用表单身份验证,并将 Principal 设置为 Application_PostAuthenticateRequest。它工作正常。

在 web Api 中,我使用 Owin。但是在使用访问令牌对每个请求进行身份验证后,我找不到设置该 Principal 的方法。

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

但是我可以在哪里将它分配给使用访问令牌自动进行身份验证的请求?

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

谢谢。

【问题讨论】:

  • 静态类不会给所有调用者相同的值吗?
  • 编辑问题:静态类只设置 Thread.CurrentPrincipal。

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


【解决方案1】:

我找到了如何设置它。

不记名验证不是由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 在我的业务层中为空。我假设令牌验证是在请求执行之外的另一个线程中完成的。所以我必须改变我的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2016-01-11
    • 2015-02-17
    • 2014-07-19
    • 1970-01-01
    • 2014-01-02
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多