【问题标题】:How to Access the Current Circuit of a Blazor Server Client如何访问 Blazor 服务器客户端的当前电路
【发布时间】:2021-08-01 11:38:33
【问题描述】:

我正在开发一个使用 ASP.NET Core Identity 的 Blazor 服务器项目。我正在尝试实现一个组件来管理当前的活动用户。我可以访问当前客户端的当前身份用户,但我似乎无法访问与当前客户端关联的电路,因为我想跟踪每个用户何时离开浏览器(电路断开连接)。

从'@enet' (link) 的回答中,我尝试实现CircuitHandler,并且我可以获得所有当前电路,但我如何知道哪个电路与哪个用户相关联?

using Microsoft.AspNetCore.Components.Server.Circuits;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;


namespace BlazorCircuitHandler.Services
{
    public class CircuitHandlerService : CircuitHandler
    {
        public ConcurrentDictionary<string, Circuit> Circuits { get; 
            set; }
        public event EventHandler CircuitsChanged;

        protected virtual void OnCircuitsChanged()
             => CircuitsChanged?.Invoke(this, EventArgs.Empty);

        public CircuitHandlerService()
        {
             Circuits = new ConcurrentDictionary<string, Circuit>();
        }

        public override Task OnCircuitOpenedAsync(Circuit circuit, 
                             CancellationToken cancellationToken)
       {
             Circuits[circuit.Id] = circuit;
             OnCircuitsChanged();
             return base.OnCircuitOpenedAsync(circuit, 
                                   cancellationToken);
       }

       public override Task OnCircuitClosedAsync(Circuit circuit, 
                 CancellationToken cancellationToken)
      {
           Circuit circuitRemoved;
           Circuits.TryRemove(circuit.Id, out circuitRemoved);
           OnCircuitsChanged();
           return base.OnCircuitClosedAsync(circuit, 
                             cancellationToken);
      }

      public override Task OnConnectionDownAsync(Circuit circuit, 
                            CancellationToken cancellationToken)
      {
          return base.OnConnectionDownAsync(circuit, 
                           cancellationToken);
      }

      public override Task OnConnectionUpAsync(Circuit circuit, 
                          CancellationToken cancellationToken)
      {
          return base.OnConnectionUpAsync(circuit, cancellationToken);
      }
   }
 }

【问题讨论】:

  • 你可以尝试访问httpcontextaccessor获取用户相关信息。
  • @BrandoZhang 我实际试过了,但是在我注入的HttpContextAccessor对象中,并没有与Circuit相关的信息。

标签: asp.net-core blazor blazor-server-side


【解决方案1】:

如果您使用 AddHttpContextAccessor 服务

services.AddHttpContextAccessor();

您可以在创建电路时获取用户:

public class MyCircuitIdStashingHandler: CircuitHandler
{
    public override Task OnCircuitOpenedAsync(Circuit circuit, CancellationToken cancellationToken)
    {
        IHttpContextAccessor accessor = new HttpContextAccessor();
        accessor.HttpContext.User.Identity; // store in dictionary somewhere
        return base.OnCircuitOpenedAsync(circuit, cancellationToken);
    }
}

...然后您可以跟踪哪个用户正在使用哪个电路

【讨论】:

  • 微软表示在 Blazor 应用中使用 IHttpContextAccessor 存在安全风险:docs.microsoft.com/en-us/aspnet/core/fundamentals/…
  • 是的 - 在创建后使用它会有风险(在生命周期的后期将未定义) - 但电路的创建将与控制器操作调用一致 - 并获得用户身份点是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2023-03-22
相关资源
最近更新 更多