C# 使用Owin JWTBeareAuthentication和OAuthAuthorizationServer时未设置当前主体

C# 使用Owin JWTBeareAuthentication和OAuthAuthorizationServer时未设置当前主体,c#,authentication,oauth-2.0,owin,bearer-token,C#,Authentication,Oauth 2.0,Owin,Bearer Token,我花了相当多的时间研究如何让我的WebApi应用程序使用Owin身份验证模型,因为我希望利用所有的社交媒体登录方法。我眼前的问题是理解在使用承载令牌集对呼叫用户进行身份验证方面我做错了什么 我的Startup.Auth已被修剪回以下内容: OAuthManager.OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); OAuthManager.OAuthServerOptions = new OAuthAuth

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

我的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的正确位置吗?我相信代币的形式应该是“持有人ey…”等

问题2:呼叫方是否应将承载令牌放置在呼叫或其他位置的“授权”头中

问题3:为什么有了上面的代码,我的OAuthServerProvider在这两种方法上都不会被发现?是什么让Owin认证系统说“等一下,我们有一个授权头,所以我应该处理它”我的客户应该做什么不同的事情

我的WebApiConfig可能会扰乱Owin OAuth吗?我设定了以下条件:

config.SuppressDefaultHostAuthentication();
虽然我不确定我是否理解这意味着什么

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

  • 创建一个用户
  • 以该用户身份登录(正确接收承载令牌)
  • 使用在“Authorization”头上设置的承载令牌进行身份验证调用(未在当前主体、HttpContext或OwinContext上设置身份验证)

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

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

    config.Filters.Add(new HostAuthenticationFilter(OAuthBearerOptions.AuthenticationType));
    
    在这之后,身份验证在OWIN世界开始起作用。出现这个问题的主要原因是,我试图将OAuth改造成一个预先存在的WebApi应用程序,而这个应用程序并没有使用可以为我完成上述工作的模板进行设置

    因此,提醒您,在WebApi配置中包括以下两行:

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