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

如何在ASP.NET Core中手动生成认证Cookie?

解决方案

实现原理

ASP.NET Core Cookie认证下发的Cookie值本质是加密后的AuthenticationTicket对象,加密使用框架内置的数据保护服务,加密规则完全匹配你在Startup中配置的Cookie认证参数,生成的Cookie可以直接被认证中间件识别。

实现步骤

1. 注入依赖服务

在你的控制器构造函数中注入两个核心服务:

private readonly IAuthenticationSchemeProvider _schemeProvider;
private readonly IDataProtectionProvider _dataProtectionProvider;

// 你的控制器构造函数
public 你的控制器名称(IAuthenticationSchemeProvider schemeProvider, 
    IDataProtectionProvider dataProtectionProvider,
    /* 保留你原有其他依赖,比如_samlServiceProvider */)
{
    _schemeProvider = schemeProvider;
    _dataProtectionProvider = dataProtectionProvider;
    // 原有其他依赖赋值
}

2. 实现Cookie值生成逻辑

封装生成认证Cookie的方法:

private async Task<string> GenerateAuthCookieValue(List<Claim> claims, out string cookieName)
{
    // 读取你在Startup中配置的Cookie认证参数
    var authScheme = await _schemeProvider.GetSchemeAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    var cookieAuthOptions = (CookieAuthenticationOptions)authScheme.Options;
    cookieName = cookieAuthOptions.Cookie.Name;

    // 构建临时认证票据
    var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    var principal = new ClaimsPrincipal(identity);
    var authProperties = new AuthenticationProperties
    {
        // 临时票据设置短有效期,降低泄露风险
        ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(5),
        IsPersistent = false
    };
    var ticket = new AuthenticationTicket(principal, authProperties, CookieAuthenticationDefaults.AuthenticationScheme);

    // 创建和框架Cookie认证匹配的加密器,目的字符串为框架约定,不要修改
    var protector = _dataProtectionProvider.CreateProtector(
        "Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
        CookieAuthenticationDefaults.AuthenticationScheme,
        "v2");
    var ticketFormat = new TicketDataFormat(protector);

    // 加密票据得到最终Cookie值
    return ticketFormat.Protect(ticket);
}

3. 替换原有调用逻辑

把SamlCallBack方法中注释How to get authentication cookie value here的位置替换为以下代码:

var cookieValue = await GenerateAuthCookieValue(claims, out var cookieName);
cookieContainer.Add(baseAddress, new Cookie(cookieName, cookieValue));

注意事项

  • 如果你在Startup配置Cookie认证时使用了自定义Scheme名称,将上述代码中所有CookieAuthenticationDefaults.AuthenticationScheme替换为你自定义的Scheme名称即可。
  • 临时生成的票据仅用于调用当前服务的/user接口,不要复用,后续正式登录仍然使用你拿到用户详情后构建的ClaimsPrincipal调用HttpContext.SignInAsync即可。
  • 如果你配置了Cookie的Domain、Path等自定义属性,添加到CookieContainer时需要对应配置,避免Cookie不生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:24:04