Net 6.0 Blazor Server登录Cookie创建与授权管理咨询
实用实现方案(.NET 6 Blazor Server)
一、基础Cookie认证配置(Program.cs)
先在Program.cs中配置Cookie认证,无需Entity Framework,直接自定义验证逻辑:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = "YourAppAuthCookie"; options.ExpireTimeSpan = TimeSpan.FromMinutes(10); // 初始有效期10分钟 options.SlidingExpiration = true; // 自动续期:每次授权请求通过后刷新有效期 options.LoginPath = "/Login"; // 未授权时跳转登录页 }); builder.Services.AddAuthorization(); // 注意添加中间件顺序 app.UseAuthentication(); app.UseAuthorization();
注:SlidingExpiration = true已满足你“访问带[Authorize]页面时刷新Cookie”的需求,无需额外编写刷新逻辑。
二、登录/注销逻辑实现(用API控制器)
Blazor Server组件中直接操作HttpContext存在风险(长连接场景下HttpContext仅初始请求可用),建议通过API控制器处理身份认证:
[ApiController] [Route("api/auth")] public class AuthController : ControllerBase { [HttpPost("login")] public async Task<IActionResult> Login([FromBody] LoginRequest request) { // 自定义用户验证逻辑(替换为你的实际验证规则,比如内存列表校验、第三方接口等) bool isValid = ValidateUser(request.Username, request.Password); if (!isValid) { return BadRequest("用户名或密码错误"); } // 构建用户身份标识 var claims = new List<Claim> { new Claim(ClaimTypes.Name, request.Username), // 按需添加权限Claim }; var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var authProps = new AuthenticationProperties { ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), IsPersistent = false // 浏览器关闭后Cookie失效 }; // 注意:创建Cookie用SignInAsync,不是你之前用的SignOutAsync(SignOutAsync是注销) await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), authProps); return Ok(); } [HttpPost("logout")] public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return Ok(); } // 示例验证方法 private bool ValidateUser(string username, string password) { return username == "admin" && password == "123456"; } } // 登录请求模型 public class LoginRequest { public string Username { get; set; } public string Password { get; set; } }
三、Blazor登录组件调用API
在Login.razor中实现登录UI并调用控制器接口:
@page "/login" @inject HttpClient Http @inject NavigationManager NavigationManager <h3>登录</h3> <div class="login-form"> <input @bind="Username" placeholder="用户名" /> <input @bind="Password" type="password" placeholder="密码" /> <button @onclick="HandleLogin">登录</button> @if (!string.IsNullOrEmpty(ErrorMessage)) { <p style="color:red">@ErrorMessage</p> } </div> @code { private string Username { get; set; } private string Password { get; set; } private string ErrorMessage { get; set; } private async Task HandleLogin() { ErrorMessage = string.Empty; try { var response = await Http.PostAsJsonAsync("/api/auth/login", new { Username, Password }); if (response.IsSuccessStatusCode) { NavigationManager.NavigateTo("/"); } else { ErrorMessage = await response.Content.ReadAsStringAsync(); } } catch (Exception ex) { ErrorMessage = $"登录失败:{ex.Message}"; } } }
四、关于ProtectedSessionStorage的说明
ProtectedSessionStorage是Blazor WebAssembly的客户端存储方案,数据存在浏览器SessionStorage中,属于客户端认证,完全不适合Blazor Server场景。- Blazor Server依赖服务器端身份验证,Cookie认证是服务器可直接校验的可靠凭证,比客户端存储更安全、更适配你的需求,无需考虑
ProtectedSessionStorage。
五、关键提醒
- 你之前误用
HttpContext.SignOutAsync是错误的,该方法用于注销用户,创建认证Cookie必须使用SignInAsync。 - 所有带
[Authorize]特性的页面/组件,会自动触发Cookie验证,结合SlidingExpiration = true即可自动续期,无需额外代码。
内容的提问来源于stack exchange,提问作者plaguebreath
相关产品推荐
相关产品推荐

