如何为匿名Action方法触发JWT与Cookie认证方案?
以下是几种可行的实现方式,根据你的场景选择即可:
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
相关产品推荐
相关产品推荐

