You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Blazor Server中为自定义AuthenticationStateProvider传递会话密钥?

问题分析与解决

你的思路是对的——通过构造函数传入会话密钥来让CustomAuthenticationStateProvider具备复用性,只是代码实现存在两处关键错误:

错误点说明

  1. Program.cs服务注册错误:你提供的工厂函数没有正确创建CustomAuthenticationStateProvider实例,既没有从服务容器获取依赖的ProtectedSessionStorage,也没有返回实例对象。
  2. 构造函数参数语法错误:C#中可选参数必须指定类型,且要放在必填参数的后面,你的代码里sessionKey参数缺少类型声明。

正确实现方式

1. 修正CustomAuthenticationStateProvider构造函数

public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
    private readonly ProtectedSessionStorage _sessionStorage;
    private readonly string _sessionKey;

    // 必填参数在前,可选参数指定类型并设置默认值
    public CustomAuthenticationStateProvider(ProtectedSessionStorage sessionStorage, string sessionKey = "12345")
    {
        _sessionStorage = sessionStorage;
        _sessionKey = sessionKey;
    }

    public override async Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        try
        {
            var userSessionStorageResult = await _sessionStorage.GetAsync<UserSession>(_sessionKey);
            
            // 示例认证逻辑,根据实际情况调整
            var anonymousUser = new ClaimsPrincipal(new ClaimsIdentity());
            if (userSessionStorageResult.Success && userSessionStorageResult.Value != null)
            {
                var claimsIdentity = new ClaimsIdentity(userSessionStorageResult.Value.Claims, "CustomAuth");
                return new AuthenticationState(new ClaimsPrincipal(claimsIdentity));
            }
            return new AuthenticationState(anonymousUser);
        }
        catch
        {
            return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
        }
    }

    // 其他自定义方法(比如更新认证状态等)
}

2. 修正Program.cs中的服务注册

// 注:Blazor Server中ProtectedSessionStorage默认已注册,这里显式注册也没问题
builder.Services.AddScoped<ProtectedSessionStorage>();

// 正确注册自定义AuthenticationStateProvider,传入自定义会话密钥
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>(serviceProvider =>
{
    // 从服务容器获取依赖的ProtectedSessionStorage实例
    var sessionStorage = serviceProvider.GetRequiredService<ProtectedSessionStorage>();
    // 自定义会话密钥
    string customSessionKey = "abcdef";
    // 创建并返回实例
    return new CustomAuthenticationStateProvider(sessionStorage, customSessionKey);
});

这样修改后,CustomAuthenticationStateProvider就能通过构造函数接收自定义的会话密钥,同时正确获取ProtectedSessionStorage依赖,实现代码复用的需求。

内容的提问来源于stack exchange,提问作者Koala163

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:10:42