【问题标题】:Current Principal not set when using Owin JwtBearerAuthentication and OAuthAuthorizationServer使用 Owin JwtBearerAuthentication 和 OAuthAuthorizationServer 时未设置当前 Principal
【发布时间】:2016-04-05 16:40:28
【问题描述】:

我花了相当多的时间研究让我的 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 是我在使用 Authorization 标头中设置的 Bearer 令牌调用服务时所需要的全部代码吗?这是放置此 Jwt 的正确位置吗?令牌的形式应该是“Bearer ey.....”等我相信。

问题 2 调用者是否应该将 Bearer 令牌放置在调用的“授权”标头中或其他位置?

问题 3 为什么有了上面的代码,我的 OAuthServerProvider 永远不会受到任何一种方法的影响?是什么让 Owin 身份验证系统说“等一下,我们有一个 Authorization 标头,所以我应该处理它”我的客户应该做些什么不同的事情?

我的 WebApiConfig 可能会扰乱 Owin OAuth 吗?我设置了以下内容:

config.SuppressDefaultHostAuthentication();

虽然我不确定我是否理解这意味着什么......

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

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

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

【问题讨论】:

    标签: c# authentication oauth-2.0 owin bearer-token


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 2017-03-13
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多