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

如何为匿名Action方法触发JWT与Cookie认证方案?

在AllowAnonymous Action中触发Cookie与JWT双认证的解决方案

以下是几种可行的实现方式,根据你的场景选择即可:

1. 手动在Action中调用认证服务

直接在标记了[AllowAnonymous]的Action里,通过IAuthenticationService手动触发两种认证方案的验证逻辑,验证成功后将用户信息附加到HttpContext.User:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Mvc;

[AllowAnonymous]
public async Task<IActionResult> Get()
{
    // 尝试Cookie认证
    var cookieAuthResult = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    // 尝试JWT认证
    var jwtAuthResult = await HttpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme);

    // 合并两种认证的Claims(也可根据需求优先选择其中一种)
    var combinedClaims = new List<Claim>();
    if (cookieAuthResult.Succeeded)
        combinedClaims.AddRange(cookieAuthResult.Principal.Claims);
    if (jwtAuthResult.Succeeded)
        combinedClaims.AddRange(jwtAuthResult.Principal.Claims);

    if (combinedClaims.Any())
    {
        var identity = new ClaimsIdentity(combinedClaims, "CombinedCookieJwtAuth");
        HttpContext.User = new ClaimsPrincipal(identity);
    }

    // 后续业务逻辑
    return Ok(new { IsAuthenticated = HttpContext.User.Identity.IsAuthenticated });
}

这种方式灵活可控,你可以自定义处理两种认证的结果,比如只取单个成功的认证信息,或者合并双方的Claims。

2. 自定义授权过滤器实现批量复用

如果多个Action都需要相同的双认证逻辑,可以创建自定义授权过滤器,在过滤器中统一触发认证,再在Action上同时标记[AllowAnonymous]和过滤器:

第一步:实现自定义过滤器

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Mvc.Filters;

public class TriggerDualAuthFilter : IAuthorizationFilter
{
    private readonly IAuthenticationService _authenticationService;

    public TriggerDualAuthFilter(IAuthenticationService authenticationService)
    {
        _authenticationService = authenticationService;
    }

    public async void OnAuthorization(AuthorizationFilterContext context)
    {
        // 触发Cookie认证
        var cookieResult = await _authenticationService.AuthenticateAsync(
            context.HttpContext, CookieAuthenticationDefaults.AuthenticationScheme);
        // 触发JWT认证
        var jwtResult = await _authenticationService.AuthenticateAsync(
            context.HttpContext, JwtBearerDefaults.AuthenticationScheme);

        // 构建合并后的用户身份
        var claims = new List<Claim>();
        if (cookieResult.Succeeded) claims.AddRange(cookieResult.Principal.Claims);
        if (jwtResult.Succeeded) claims.AddRange(jwtResult.Principal.Claims);

        if (claims.Any())
        {
            context.HttpContext.User = new ClaimsPrincipal(
                new ClaimsIdentity(claims, "DualAuthScheme"));
        }
    }
}

第二步:在Action上使用过滤器

[AllowAnonymous]
[TypeFilter(typeof(TriggerDualAuthFilter))]
public IActionResult Get()
{
    // 此时HttpContext.User已包含双认证后的用户信息(如果任一认证成功)
    return Ok();
}

这种方式适合批量复用场景,避免重复编写认证逻辑。

注意事项

  • ASP.NET Core 3.0+版本中,AutomaticAuthenticate属性已被废弃,不建议通过全局配置自动触发多种认证,易引发不可预期的行为,优先使用上述显式触发的方式。
  • 若需要严格要求两种认证同时成功(用户必须同时提供有效的Cookie和JWT Token),只需在代码中判断两个认证结果是否均为Succeeded,再构建用户身份即可。

内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:52:54