使用 Owin JwtBearerAuthentication 和 OAuthAuthorizationServer 时未设置当前主体

Current Principal not set when using Owin JwtBearerAuthentication and OAuthAuthorizationServer

我花了相当多的时间研究让我的 WebApi 应用程序使用 Owin 身份验证模型,因为我希望利用所有社交媒体登录方法。我的直接问题是了解我在使用 Bearer 令牌集对调用用户进行身份验证方面做错了什么。

我的 Startup.Auth 已被缩减为仅以下内容:

OAuthManager.OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

        OAuthManager.OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/oauth/token"),
            AuthorizeEndpointPath = new PathString("/oauth/externallogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
            AccessTokenFormat = new MyJwtFormat(),
            Provider = new MyOAuthServerProvider(),
        };

        app.UseOAuthAuthorizationServer(OAuthManager.OAuthServerOptions);
        app.UseJwtBearerAuthentication(new MyJwtBearerOptions());

MyOAuthServerProvider 看起来像这样:

public class OAuthServerProvider : OAuthAuthorizationServerProvider
{
    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var result = base.GrantResourceOwnerCredentials(context);
        return result;
    }

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult(true);
    }
}

问题 1 是我在使用授权 header 中设置的 Bearer 令牌调用服务时需要的全部代码吗?这是放置此 Jwt 的正确位置吗?我相信令牌应该是 'Bearer ey.....' 等形式。

问题 2 呼叫者是否应该将 Bearer 令牌放在呼叫中的 'Authorization' header 或其他位置?

问题 3 为什么使用上述代码后我的 OAuthServerProvider 永远不会在任何一种方法上受到攻击?是什么让 Owin 身份验证系统说“稍等,我们已经获得授权 header,所以我应该处理它”我的客户应该做些什么不同的事情?

我的 WebApiConfig 是否有可能扰乱了 Owin OAuth?我设置了以下内容:

config.SuppressDefaultHostAuthentication();

虽然我不确定我明白那是什么意思...

我正在尝试使用执行以下操作的集成测试来测试上述内容:

  1. 创建用户
  2. 以该用户身份登录(正确接收 Bearer 令牌)
  3. 使用 'Authorization' header 上设置的 Bearer 令牌进行经过身份验证的调用(未在当前主体、HttpContext 或 OwinContext 上设置身份验证)

请问我问题以澄清,这会花费我很多时间!非常感谢您的帮助。

事实证明,我的 WebApi 配置扰乱了身份验证过程。我忽略了包括非常重要的行:

config.Filters.Add(new HostAuthenticationFilter(OAuthBearerOptions.AuthenticationType));

之后,身份验证在 OWIN 世界中开始发挥作用。发生此问题的主要原因是我试图将 OAuth 改造为一个预先存在的 WebApi 应用程序,该应用程序尚未使用可以为我完成上述操作的模板进行设置。

所以提醒一下,在您的 WebApi 配置中包括以下两行:

config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthManager.OAuthBearerOptions.AuthenticationType));