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

ASP.NET MVC Core与IdentityServer4:AddAuthentication中defaultScheme设置疑问

关于ASP.NET Core认证方案的疑问解答

嘿,我来帮你理清楚这个点:设置defaultScheme: "Cookies"并不代表你的MVC应用只能接受Cookie认证,它只是指定了「默认使用的认证方案」而已。

先搞懂defaultScheme的作用

options.DefaultScheme = "Cookies"的意思是:当你的代码没有明确指定要使用哪种认证方案时(比如[Authorize]特性没加AuthenticationSchemes参数),系统会默认用Cookie认证来处理请求。

但这完全不影响你添加其他认证方案(比如JWT AccessToken),只要你在AddAuthentication之后注册对应的认证处理逻辑,应用就能同时支持多种认证方式。

如何让应用同时支持Cookie和AccessToken?

举个例子,在你现有的代码基础上,添加JWT Bearer认证的配置,就能让应用接受AccessToken了:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

services.AddAuthentication(options => 
{
    options.DefaultScheme = "Cookies"; // 默认用Cookie认证
    // 可选:设置默认的挑战方案,比如未认证时对API返回401,对MVC页面跳转到登录页
    // options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
// 注册Cookie认证方案
.AddCookie("Cookies", options =>
{
    // 这里可以配置Cookie的登录路径、过期时间等
    options.LoginPath = "/Account/Login";
})
// 注册JWT Bearer认证方案,用来处理AccessToken
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = Configuration["Jwt:Issuer"], // 从配置文件读你的颁发者
        ValidAudience = Configuration["Jwt:Audience"], // 受众
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) // 签名密钥
    };
});

怎么指定用哪种认证方式?

  • 如果是MVC页面,默认会用Cookie认证,符合常规的登录场景;
  • 如果是API接口,你可以在[Authorize]特性里指定用JWT:
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public IActionResult MyApi()
    {
        // ...
    }
    
  • 如果你想让某个接口同时接受Cookie和AccessToken两种认证方式,可以自定义授权策略:
    services.AddAuthorization(options =>
    {
        options.AddPolicy("CookieOrJwt", policy =>
        {
            policy.AuthenticationSchemes.Add("Cookies");
            policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
            policy.RequireAuthenticatedUser();
        });
    });
    
    然后在控制器/接口上用:
    [Authorize(Policy = "CookieOrJwt")]
    

回到你的原始代码

你现在的代码只配置了DefaultScheme为Cookies,但没有添加其他认证方案的注册,所以当前应用确实只能处理Cookie认证。但只要补充添加JWT(或其他)认证的配置,就能支持AccessToken了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:43