我正在向ASP.NET Web API 4.6 OWIN
移植一个ASP.NET Core 2.1
应用程序。该应用程序基于JWT
令牌工作。但是令牌通过cookie而不是标头传递。我不确定为什么不使用标题,这只是我必须处理的情况。
考虑不通过cookie进行身份验证。 Cookie仅用作转移媒体。在遗留应用程序中,CookieOAuthBearerProvider
用于从cookie中提取JWT
令牌。配置代码如下:
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audienceId },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
},
Provider = new CookieOAuthBearerProvider("token")
});
}
CookieOAuthBearerProvider
类源代码如下:
public class CookieOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
readonly string _name;
public CookieOAuthBearerProvider(string name)
{
_name = name;
}
public override Task RequestToken(OAuthRequestTokenContext context)
{
var value = context.Request.Cookies[_name];
if (!string.IsNullOrEmpty(value))
{
context.Token = value;
}
return Task.FromResult<object>(null);
}
这个解决方案将更详细地讨论here。
现在我需要为ASP.NET Core实现类似的解决方案。问题是UseJwtBearerAuthentication
不再存在于ASP.NET Core
中,我不知道如何引入自定义AuthenticationProvider。
任何帮助都非常感谢。
更新:有a solution that tries to validate JWT by its own code。这不是我需要的。我只是在寻找一种方法将从cookie收到的令牌传递给标题阅读器。
在ASP.NET Core 2.0中,身份验证系统进行了一些改进。而不是使用例如UseJwtBearerAuthentication
作为中间件,ASP.NET Core 2.0+使用DI配置内容。例如,这看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
// ...
});
}
有了这个,下一个问题是:我们如何指示JwtBearer身份验证过程使用这个新系统查看cookie?
传递给options
的AddJwtBearer
对象包含自己的Events
属性,允许您自定义过程的各个部分。使用OnMessageReceived
,您可以实现您的目标:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
context.Token = context.Request.Cookies["CookieName"];
return Task.CompletedTask;
}
};
});
}
通过设置context.Token
,您告诉JwtBearer进程您自己负责提取令牌。
Here是一个有用的迁移文档,可以更详细地解释身份验证更改。