Microsoft.Identity.Web和ASP.NET核心SignalR JWT身份验证


我正在使用ASP.NET核心来制作一个web应用程序,也使用SignalR核心来提供实时功能。我使用Azure AD B2C进行用户管理。我已经成功地使用Microsoft.Identity.Web (https://github.com/AzureAD/microsoft-identity-web)通过Azure AD B2C生成的令牌来保护我的API端点。

我也想为我的SignalR核心集线器做同样的事情。文档中的内容是向您的集线器/方法添加适当的注释,我已经这样做了。SignalR的客户端库将访问令牌作为查询参数添加,必须在ASP.NET核心应用程序的配置中手动提取该参数并将其添加到上下文中,如下所示。

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                var accessToken = context.Request.Query["access_token"];

                // If the request is for our hub...
                var path = context.HttpContext.Request.Path;
                if (!string.IsNullOrEmpty(accessToken) &&
                    (path.StartsWithSegments("/hubs/chat")))
                {
                    // Read the token out of the query string
                    context.Token = accessToken;
                }
                return Task.CompletedTask;
            }
        };
    });

然而,这似乎与Microsoft.Identity.Web提供的配置不兼容,如下所示:

        services
            .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));

如何让SignalR与Microsoft.Identity.Web协同工作

转载请注明出处:http://www.fortunesungroup.com/article/20230331/1005023.html