首页 > 解决方案 > 创建 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;
        }
    };
});````

标签: asp.net-corejwtasp.net-authentication

解决方案


推荐阅读