我正在尝试将 JWT 身份验证添加到我的 Razor Page Web 应用程序中。我希望用户输入他的电子邮件地址,然后检查该电子邮件是否存在于我的数据库中。如果地址存储在数据库中,我想创建一个令牌并将其存储在会话中。
我在 stackoverflow/youtube/internet 上没有找到任何关于如何使用 razorpages 实现类似功能的内容。那么你有什么想法我可以如何使用剃刀页面进行设置吗?
我尝试遵循一些教程,但没有真正解决问题。
1。我的program.cs是这样配置的。
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.RequireHttpsMetadata = false;
o.SaveToken = true;
o.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JwtSettings:Key"])),
ValidateIssuer = true,
ValidIssuer = configuration["JwtSettings:Issuer"],
ValidateAudience = false,
ValidateLifetime = true,
};
});
services.AddAuthorization();
2。我的帖子方法在按下登录按钮后被调用,如下所示。在这个方法中,我想将令牌存储在会话或cookie中。
public async Task<IActionResult> OnPost()
{
await _loginRepository.CreateToken(Email);
//TODO store token here
return RedirectToPage("/Picture/Index");
}
检查电子邮件是否存在后,我将生成一个令牌,然后重定向到受
[Autroize(Roles = "Admin")]
保护的页面。
我的代币生成
public async Task<bool> CreateToken(string email, CancellationToken cancellationToken = default)
{
var journalists = await _zentralContext.v_PressInfo_Journalisten.Select(s => s.Email).ToListAsync();
if (journalists.Contains(email))
{
var journalist = await _zentralContext.v_PressInfo_Journalisten.Where(w => w.Email == email).FirstAsync();
var token = CreateToken(email);
//Store Token here??
return true;
}
else
{
return false;
}
}
private string CreateToken(string email)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("TheSecretKeyNeedsToBePrettyLongSoWeNeedToAddSomeCharsHere"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(ClaimTypes.Email, email),
new Claim(ClaimTypes.Role, "Admin")
};
var token = new JwtSecurityToken(
issuer: "Presseinfo Extern",
claims: claims,
expires: DateTime.Now.AddDays(1),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}