我正在将 ASP.NET Web API 4.6 OWIN
应用程序移植到 ASP.NET Core 2.1
。该应用程序基于 JWT
token 运行。但是 token 通过 cookie 而不是 header 传递。我不确定为什么不使用 header ,这只是我必须处理的情况。
考虑身份验证不是通过 cookie 完成的。 cookie 仅用作传输媒体。在遗留应用程序中,CookieOAuthBearerProvider
用于从 cookie 中提取 JWT
token 。配置代码如下:
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 收到的 token 传递给 header 阅读器。
最佳答案
在 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?
被传递到 AddJwtBearer
的 options
对象包含它自己的 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 进程您已经自行提取 token 。
Here是一份有用的迁移文档,更详细地解释了身份验证更改。
关于c# - 在 ASP.NET Core 中,从 Cookie 而不是 Headers 中读取 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184431/