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

自定义Blazor Server端身份认证:无SQL库JSON存用户数据相关问题

Blazor服务端无SQL身份认证实现方案

1. JSON用户数据存储实现

你可以直接用JSON文件持久化所有用户、角色、自定义Claim数据,不需要依赖SQL数据库:

  • 首先定义JSON用户存储结构示例,可保存为Users.json放在服务端项目根目录:
[
  {
    "UserId": "1",
    "Email": "admin@example.com",
    "PasswordHash": "哈希后的密码",
    "Roles": ["Admin", "User"],
    "CustomClaims": {
      "DisplayName": "系统管理员",
      "Department": "技术部"
    }
  },
  {
    "UserId": "2",
    "Email": "user@example.com",
    "PasswordHash": "哈希后的密码",
    "Roles": ["User"],
    "CustomClaims": {
      "DisplayName": "普通用户",
      "Department": "运营部"
    }
  }
]
  • 服务端读取JSON可以用System.Text.Json内置类库,应用启动时预读到内存缓存,或者每次身份校验时读取即可,小访问量场景无性能问题。
    注意不要在JSON中存储明文密码,可使用ASP.NET Core自带的PasswordHasher工具类做密码哈希与校验

2. 扩展现有认证方法添加角色与自定义Claim

你现有的markUserAsAuthenticated方法可以直接扩展,从JSON用户数据中取出对应角色、自定义Claim加入身份凭证即可,修改后代码示例:

public void markUserAsAuthenticated(string emailAddress)
{
    // 从你的JSON用户列表中查询当前邮箱对应的完整用户信息
    var currentUser = AllUsers.First(u => u.Email == emailAddress);
    
    // 初始化Claim列表,先加基础用户名Claim
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Name, emailAddress),
        new Claim(ClaimTypes.NameIdentifier, currentUser.UserId)
    };
    // 添加所有角色Claim
    foreach(var role in currentUser.Roles)
    {
        claims.Add(new Claim(ClaimTypes.Role, role));
    }
    // 添加所有自定义Claim
    foreach(var claim in currentUser.CustomClaims)
    {
        claims.Add(new Claim(claim.Key, claim.Value));
    }

    var identity = new ClaimsIdentity(claims, "CustomAuth"); 
    var user = new ClaimsPrincipal(identity);
    NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
}

添加完成后即可在组件中直接使用授权功能:

  • 页面级权限控制直接加@attribute [Authorize(Roles = "Admin")]
  • 页面内权限判断用@User.IsInRole("Admin")
  • 读取自定义Claim用@User.FindFirstValue("DisplayName")

3. Cookie与JWT选型及配置

Blazor服务端场景优先使用Cookie认证,是ASP.NET Core原生支持的能力,不需要依赖Visual Studio的身份脚手架,VSCode完全可以手动配置:

  • 首先在Program.cs中添加Cookie认证服务配置:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Login";
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromDays(7);
    });
builder.Services.AddAuthorization();
  • 中间件管道配置需要按顺序添加:
app.UseRouting();
// 注意以下两个中间件顺序不能反
app.UseAuthentication();
app.UseAuthorization();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

如果后续需要对接API或者移动端,可以选择JWT认证,Blazor服务端使用JWT需要额外处理令牌的存储与续期,复杂度比Cookie高,无跨端需求不建议优先选择。

4. VSCode开发适配说明

Blazor身份认证实现和IDE无绑定关系,VSCode不需要使用Visual Studio的可视化身份脚手架,所有配置、代码都可以手动编写,通过.NET CLI即可完成所有项目操作:

  • 添加依赖包用dotnet add package 包名
  • 运行项目用dotnet run
  • 发布项目用dotnet publish
    自行实现的认证逻辑完全可以适配现有用户列表,不需要修改现有校验逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:06:03