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

时间:2016-03-30 19:07:31

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

我花了大量时间考虑让我的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是上述代码在使用授权标头中设置的承载令牌调用服务时所需的全部内容吗?这是放置这个Jwt的正确位置吗?令牌应该是“Bearer ey .....”等形式,我相信。

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

问题3为什么使用上面的代码是我的OAuthServerProvider永远不会遇到任何一种方法?是什么让Owin身份验证系统说“等一下,我们有一个授权标题,所以我应该处理'我的客户应该采取哪些不同的做法?

我的WebApiConfig可能会让Owin OAuth感到不安吗?我已经设置了以下内容:

config.SuppressDefaultHostAuthentication();

虽然我不确定我明白这意味着什么......

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

  1. 创建用户
  2. 以该用户身份登录(正确接收承载令牌)
  3. 使用“授权”标题上设置的承载令牌进行经过身份验证的调用(未在当前主体,HttpContext或OwinContext上设置身份验证)
  4. 请向我提问以便澄清,这耗费了我很多时间!非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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

因此,只需提醒一下,在您的WebApi配置中包含两行:

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