gpt4 book ai didi

jwt - 使用 AuthenticateAsync 生成 JWT token

转载 作者:行者123 更新时间:2023-12-03 14:43:11 31 4
gpt4 key购买 nike

我正在尝试使用 ClaimsPrincipal 登录,然后在 .net core 2.0 中获取 JWT。使用我当前的代码,我从 SignInAsync 函数的结果中得到错误:“没有 IAuthenticationSignInHandler 配置为处理方案的登录:Bearer”

这是我目前使用的 Controller :

[Route("Login/{username}")]
public async Task<IActionResult> Login(string username)
{
var userClaims = new List<Claim>
{
new Claim(ClaimTypes.Name, username)
};
var principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));
var sign = HttpContext.SignInAsync(principal);
await sign;
var res = await HttpContext.AuthenticateAsync();
var token = await HttpContext.GetTokenAsync("access_token");
return Json(token);
}

登录部分已经过测试,可以很好地使用 cookie。但是,当我在 startup.cs 中将以下代码与 JwtBearerDefaults.AuthenticationScheme 一起使用时:

services.AddAuthentication(config => {
config.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(config =>
{
config.TokenValidationParameters = Token.tokenValidationParameters;
config.RequireHttpsMetadata = false;
config.SaveToken = true;
});

我从 SignInAsync 函数的结果中得到错误:“没有 IAuthenticationSignInHandler 配置为处理方案的登录:Bearer”

我的 Token 类是借助我在网上找到的代码(在 JWT on .NET Core 2.0 )创建的,定义如下:

public static class Token
{

public static TokenValidationParameters tokenValidationParameters {
get
{

return new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = GetSignInKey(),
ValidateIssuer = true,
ValidIssuer = GetIssuer(),
ValidateAudience = true,
ValidAudience = GetAudience(),
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
}
}

static private SymmetricSecurityKey GetSignInKey()
{
const string secretKey = "very_long_very_secret_secret";
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));

return signingKey;
}

static private string GetIssuer()
{
return "issuer";
}

static private string GetAudience()
{
return "audience";
}

}

最佳答案

如果我通过查看 JwtBearerHandler 的源代码正确理解它,它不会实现 IAuthenticationSignInHandler,这就是您收到此错误的原因。调用 SignInAsync 旨在保留身份验证信息,例如创建的身份验证 cookie,这正是 CookieAuthenticationHandler 所做的。但是对于 JWT 来说,没有一个众所周知的地方来存储 token ,因此根本没有理由调用 SignInAsync。取而代之的是,获取 token 并将其传递回浏览器。假设您正在重定向,您可以将其放入查询字符串中。假设浏览器应用程序是一个 SPA(即基于 Angular 的)并且您需要 token 来进行 AJAX 调用,您应该将 token 存储在 SPA 中并随每个 API 请求一起发送。关于如何将 JWT 与不同类型的 SPA 一起使用,有一些很好的教程,例如:https://medium.com/beautiful-angular/angular-2-and-jwt-authentication-d30c21a2f24f

请记住,JwtBearerHandler 期望在其中找到带有 Bearer 的身份验证 header ,因此如果您的 AJAX 调用将 token 放入查询字符串中,您将需要提供 JwtBearerEvents.OnMessageReceived 实现,该实现将从查询字符串中获取 token 并将其放入标题。

关于jwt - 使用 AuthenticateAsync 生成 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45848942/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com