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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:16:22