Blazor Server 的 Azure SignalR 服务和身份核心

问题描述 投票:0回答:1

在本地使用 SignalR 核心时,我可以使用 HubCallerContext 通过 Hub 访问我的身份声明原则,例如:

string userIdentifier = Context.UserIdentifier 

我通过将 .AspNetCore.Identity.Application cookie 传递给 集线器连接生成器:

 hubConnection = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"), options =>
     {
          options.Cookies = GetAuthCookieContainer();
     })
    .Build();
    await hubConnection.StartAsync();

    private CookieContainer GetAuthCookieContainer()
    {
        string cookieName = ".AspNetCore.Identity.Application";
        string domainName = new Uri(Navigation.BaseUri).Host;
        CookieContainer cookieContainer = new CookieContainer();
        if (HttpContext.HttpContext != null)
        {
            var token = HttpContext.HttpContext.Request.Cookies[cookieName];
            if (token != null)
            {
                cookieContainer.Add(new Cookie(cookieName, token) { Domain = domainName });
            }
        }
        return cookieContainer;
    } 

将 Azure SignalR 服务添加到 Program.cs 后,此功能将停止工作:

builder.Services.AddSignalR().AddAzureSignalR();

这是因为将 Azure SignalR 添加到 DI 后,我无法将身份 cookie 传递给 HubConnectionBuilder,因为 HttpContext 始终为 null。除此之外,SignalR Azure 可以按预期工作。

有谁知道如何在使用 Azure SignalR 时将 AspNetCore.Identity.Application cookie 传递给 HubConnectionBuilder() 的解决方案,或者是否有更好的方法来解决此问题?

asp.net-core blazor-server-side asp.net-core-identity azure-signalr
1个回答
0
投票

问题

将 Azure SignalR 服务添加到 DI 后,HttpContext 为 null。

解决方案

  1. 创建一个范围服务来存储来自 HttpContext 的属性并添加到program.cs:
builder.Services.AddScoped<IdentityInformation>();
  1. 在 _Host.cstml 中创建一个对象(InitialApplicationState)来存储 HttpContext 中所需的参数,然后将此对象作为参数传递给您的 App 组件:
var state = new InitialApplicationState();
state.IsAuthenticated = HttpContext.User.Identity.IsAuthenticated;
...
<component type="typeof(App)" param-InitialState="state" render-mode="ServerPrerendered" /> 
  1. 在 App.razor 中添加一个参数属性来存储从 _Host.cshtml 发送的参数,然后将它们分配给您注入的服务:
    @inject IdentityInformation identityInformation

    [Parameter]
    public InitialApplicationState InitialState { get; set; }

     protected override void OnInitialized()
     {
        identityInformation.IsAuthenticated = InitialState.IsAuthenticated;
     }

  1. 您现在可以注入“IdentityInformation”服务并从 Blazor 应用程序中的任何位置安全地访问存储的 HttpContext 属性!

非常感谢 codewrinkles YouTube 频道提供的解决方案:https://www.youtube.com/watch?v=Eh4xPgP5PsM

© www.soinside.com 2019 - 2024. All rights reserved.