我正在将Provisional headers are shown
Accept: application/json, text/plain, */*
acl: private
Content-Type: audio/mp3
key: voice_tests/sample.mp3
Origin: https://localhost:4200
policy:xxx
Referer: https://localhost:4200/app/casting-setup/7782/29867
success_action_status: 201
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
X-amz-algorithm: xxx
X-amz-credential: xxx
X-amz-date: xxx
X-amz-expires: xxx
X-amz-signature: xxx
应用程序移植到ASP.NET Web API 4.6 OWIN
。该应用程序基于ASP.NET Core 2.1
令牌运行。但是令牌通过cookie而不是标头传递。我不确定为什么不使用标题,这只是我必须处理的情况。
考虑不通过cookie进行身份验证。 cookie仅用作传输介质。在旧版应用程序中,使用JWT
从cookie中提取CookieOAuthBearerProvider
令牌。配置代码如下:
JWT
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audienceId },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
},
Provider = new CookieOAuthBearerProvider("token")
});
}
类源代码如下:
CookieOAuthBearerProvider
此解决方案在here上进行了更详细的讨论。
现在,我需要为ASP.NET Core实现类似的解决方案。问题是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);
}
中不再存在UseJwtBearerAuthentication
,而且我不知道如何引入自定义AuthenticationProvider。
我们非常感谢您的帮助。
更新: 有a solution that tries to validate JWT by its own code。这不是我所需要的。我只是在寻找一种方法,将从cookie接收的令牌传递给标头读取器。
答案 0 :(得分:5)
在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
的{{1}}对象包含其自己的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;
}
};
});
}
,您会告诉JwtBearer进程您已经自己提取了令牌。
Here是有用的迁移文档,它详细说明了身份验证更改。