使用 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();
虽然我不确定我明白那是什么意思...
我正在尝试使用执行以下操作的集成测试来测试上述内容:
- 创建用户
- 以该用户身份登录(正确接收 Bearer 令牌)
- 使用 '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));
我花了相当多的时间研究让我的 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();
虽然我不确定我明白那是什么意思...
我正在尝试使用执行以下操作的集成测试来测试上述内容:
- 创建用户
- 以该用户身份登录(正确接收 Bearer 令牌)
- 使用 '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));