自定义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
相关产品推荐
相关产品推荐

