使用 ASP.NET Core 中的特定方案授权Authorize with a specific scheme in ASP.NET Core

身份验证方案是在身份验证过程中配置身份验证服务时命名的。例如:

在前面的代码中,添加了两个身份验证处理程序:一个用于 cookie,另一个用于持有者。

备注

指定默认方案将导致设置为该标识的 属性。如果不需要该行为,请通过调用 AddAuthentication的无参数形式来禁用它。

  1. [Authorize(AuthenticationSchemes = AuthSchemes)]
  2. public class MixedController : Controller
  3. // Requires the following imports:
  4. // using Microsoft.AspNetCore.Authentication.Cookies;
  5. // using Microsoft.AspNetCore.Authentication.JwtBearer;
  6. private const string AuthSchemes =
  7. CookieAuthenticationDefaults.AuthenticationScheme + "," +

在前面的示例中,cookie 和持有者处理程序都运行,并且有机会为当前用户创建并追加标识。通过仅指定一个方案,将运行相应的处理程序。

在前面的代码中,只有具有 "持有者" 方案的处理程序才会运行。将忽略任何基于 cookie 的标识。

如果希望在中指定所需的方案,则可以在添加策略时设置 AuthenticationSchemes 集合:

  1. services.AddAuthorization(options =>
  2. options.AddPolicy("Over18", policy =>
  3. {
  4. policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
  5. policy.RequireAuthenticatedUser();
  6. policy.Requirements.Add(new MinimumAgeRequirement());
  7. });
  8. });

在前面的示例中,"Over18" 策略仅针对 "持有者" 处理程序创建的标识运行。通过设置 [Authorize] 属性的 Policy 属性来使用该策略:

添加想要接受的所有身份验证方案。例如,Startup.ConfigureServices 中的以下代码将添加两个具有不同颁发者的 JWT 持有者身份验证方案:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  4. .AddJwtBearer(options =>
  5. {
  6. options.Audience = "https://localhost:5000/";
  7. options.Authority = "https://localhost:5000/identity/";
  8. })
  9. .AddJwtBearer("AzureAD", options =>
  10. {
  11. options.Audience = "https://localhost:5000/";
  12. options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
  13. }

备注

JwtBearerDefaults.AuthenticationScheme的默认身份验证方案注册一个 JWT 持有者身份验证。必须使用唯一的身份验证方案注册附加身份验证。

下一步是更新默认授权策略,以接受这两种身份验证方案。例如: