asp.net-core - 创建 Blazor 服务器登录页面以获取 Jwt
问题描述
我们有一个打包为电子桌面应用程序的 Blazor 服务器应用程序。
身份不能与应用程序一起存在,它必须是远程的,所以我决定使用 Jwt。我创建了一个 Jwt 服务器并在 Blazor 服务器应用程序 startup.cs 中启用了 JwtBearer 中间件(请参阅代码)。
目前我们可以在 'JwtBearerEvents --> OnMessageReceived' 中手动将 Jwt 附加到 context.Token ,中间件会选择它,因此我们可以使用 [Authorize] 并且还包括策略 [Authorize(Policy="account_write")] 这很好用。
Jwt 是在 Postman 中手动创建的(调用我们的 Jwt 服务器并粘贴到结果中 - 请参阅代码),因为我无法弄清楚如何拥有一个使用 Un/Pw 从服务器获取 Jwt 的登录页面。
我很欣赏在 SignalR 启动之前 HTTP 仅适用于少数请求,这是问题的症结所在,但我希望有办法解决这个问题。
我想我可以使用 Blazor 和 razor 页面的组合,即登录页面是 cshtml 并将令牌保存到 LocalStorage 或 Cookie 然后我们启动 blazor(针对 blazor.server.js 的 Javascript 自动启动)并读取 cookie - 我没有能够让它工作,因为我不能让剃须刀和 cshtml 一起工作。
任何想法如何创建登录页面来获取 Jwt 并将其附加到上下文中?
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
RequireExpirationTime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
// Is token in Querystring?
var accessToken = context.Request.Query["access_token"];
Debug.WriteLine($"JwtBearer - OnMessageReceived - access_token in QS: {ShorterJWT(accessToken)}");
//
// Attach the token manually
//
// Jwt fetched manually using Postman - 10 year
accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjNjMzIxMjI2LTFhNGYtNGQ3NS1iZjM1LTIwYjQ1NmVlYmYzOSIsImJvb2tlciI6InRydWUiLCJuYW1lIjoiQm9iIENyYXRjaGV0IiwibmJmIjoxNjI5NzM3MTk4LCJleHAiOjE5NDUyNjk5OTgsImlhdCI6MTYyOTczNzE5OH0.N9HUFM3zIl9BkoPJlPj_WQIUhhQ2Rk53ymEEm42LTD4";
context.Token = accessToken;
return Task.CompletedTask;
}
};
});````
解决方案
推荐阅读
- angular - 无法在 Angular 6 TS 中访问 POST 服务
- javascript - 你如何使增量计数器更具可读性?
- reactjs - SCRIPT438:对象不支持属性或方法“setPrototypeOf”
- vim - 在 Vim 中替换整个字符串
- javascript - 根据每个页面的 URL 添加活动类
- angular - 类型数据上不存在属性触发器:Angular ts 文件中的字符串 Jquery
- python-3.x - python中的SGD分类器和SGD回归器有什么区别?
- lua - 输入错误类型后,如何对一个变量执行两次“io.read”?
- javascript - 是否可以将 styleid 动态分配给所有元素?
- ruby - bundle install 给出错误 Bundler::HTTPError 无法从 http://rubygems.org/ 获取规范