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
相关产品推荐
相关产品推荐

