通过


ASP.NET Core身份验证概述

By Mike Rousos

身份验证是确定用户标识的过程。 Authorization是确定用户是否具有对资源访问权限的过程。 在 ASP.NET Core 中,身份验证由身份验证服务IAuthenticationService处理,并由身份验证中间件中间件使用。 身份验证服务会使用已注册的身份验证处理程序来完成与身份验证相关的操作。 与身份验证相关的操作示例包括:

  • 对用户进行身份验证。
  • 当未经身份验证的用户尝试access受限资源时做出响应。

已注册的身份验证处理程序及其配置选项被称为“方案”。

在 中通过注册身份验证服务来指定身份验证方案。

  • 方式是在调用 后调用方案特定的扩展方法(例如 或 )。 这些扩展方法使用 将方案注册到合适的设置中。
  • 不太常用的方法是直接调用 。

例如,下列代码会为 和 JWT 持有者身份验证方案注册身份验证服务和处理程序:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
        options => builder.Configuration.Bind("JwtSettings", options))
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
        options => builder.Configuration.Bind("CookieSettings", options));

参数 是方案的名称,未请求特定方案时会默认使用此名称。

如果使用了多个方案,授权策略(或授权属性)可指定对用户进行身份验证时要依据的一个或多个身份验证方案。 在上例中,可通过指定 身份验证方案的名称来使用该方案(默认为 ,但也可在调用 时提供其他名称)。

在某些情况下,其他扩展方法会自动调用 。 例如,使用 ASP.NET Core Identity 时,AddAuthentication在内部调用。

通过调用 ,在 中添加身份验证中间件。 如果调用 ,会注册使用之前注册的身份验证方案的中间件。 在任何依赖用户身份验证的中间件之前调用 。

身份验证概念

身份验证负责提供 以进行授权,从而针对其做出权限决策。 可通过多种身份验证方案方法来选择使用哪种身份验证处理程序负责生成正确的声明集:

  • 身份验证方案
  • 默认身份验证方案,将在接下来的两节中讨论。
  • 直接设置 。

如果只注册了单个身份验证方案,则该方案将成为默认方案。 如果注册了多个方案且未指定默认方案,则必须在授权属性中指定该方案,否则将引发以下错误:

InvalidOperationException:未指定 authenticationScheme,且未找到 DefaultAuthenticateScheme。 可使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(ActionAuthenticationOptions configureOptions) 设置默认方案。

DefaultScheme

如果只注册了单个身份验证方案,则单个身份验证方案:

  • 自动用作 。
  • 消除了在 或 中指定 的需要。

若要禁用自动将单个身份验证方案用作 ,请调用 。

身份验证方案

身份验证方案可选择使用哪种身份验证处理程序负责生成正确的声明集。 有关详细信息,请参阅使用特定方案授权。

身份验证方案是与下列项相对应的名称:

  • 身份验证处理程序。
  • 用于配置该处理程序特定实例的选项。

方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。 例如,授权策略可使用方案名称来指定应使用哪种(或哪些)身份验证方案来对用户进行身份验证。 配置身份验证时,通常是指定默认身份验证方案。 除非资源请求了特定方案,否则使用默认方案。 还可以做到:

  • 指定其他默认方案供授权、挑战和禁止操作使用。
  • 可通过策略方案将多个方案合成一个。

身份验证处理程序

身份验证处理程序:

  • 是一种实现某个方案行为的类型。
  • 派生自 或 。
  • 具有对用户进行身份验证的主要责任。

根据身份验证方案的配置和传入的请求上下文,身份验证处理程序:

  • 构造表示用户标识(如果身份验证成功)的 对象。
  • 返回“无结果”或“失败”(若身份验证失败)。
  • 当用户尝试访问资源时,应有挑战和禁止操作的方法:
    • 他们未经授权访问(禁止)。
    • 他们未经过身份验证(挑战)。

是需要远程身份验证步骤的身份验证类。 远程身份验证步骤完成后,处理程序将调用其所设置的 。 处理程序使用传递给 回调路径的信息完成身份验证步骤。 OAuth 2.0OIDC都使用此模式。 JWT 和 Cookie 不使用此模式,因为它们可以直接使用持有者标头和 进行身份验证。 在这种情况下,托管在远程服务器上的提供商:

  • 是身份验证提供程序。
  • 示例包括 Facebook、Twitter、Google、Microsoft 和任何其他使用处理程序机制处理用户身份验证的 OIDC 提供程序。

认证

身份验证方案的身份验证操作负责基于请求上下文构造用户的标识。 它返回一个 ,指示身份验证是否成功,如果是,则返回身份验证票证中的用户标识。 请参阅 。 身份验证示例包括:

  • 身份验证方案,用于从 Cookie 构造用户的标识。
  • 对 JWT 持有者令牌进行反序列化和验证以构造用户身份的 JWT 持有者方案。

挑战

当未经身份验证的用户请求要求身份验证的终结点时,授权会发起身份验证挑战。 例如,当匿名用户请求受限资源或访问登录链接时,会引发身份验证挑战。 授权会使用指定的身份验证方案启动质询请求过程,如果没有指定,则使用默认方案。 请参阅 。 身份验证挑战示例包括:

  • 将用户重定向到登录页面的 身份验证方案。
  • JWT 承载者方案返回带有 标头的 401 状态码结果。

质询操作应让用户知道用于访问所请求资源的身份验证机制。

禁止

当经过身份验证的用户尝试访问不允许其访问的资源时,授权会调用身份验证方案的禁止操作。 请参阅 。 身份验证禁止示例包括:

  • cookie 身份验证方案,将用户重定向到一个页面,指示访问被禁止。
  • JWT持有者身份验证方案返回403结果。
  • 一种自定义身份验证方案,重定向用户到可以请求访问资源的页面。

用户可通过禁止操作知道:

  • 他们已经过身份验证。
  • 他们不被允许访问请求的资源。

请查看以下链接,了解挑战与禁止之间区别:

  • 使用操作资源处理程序的挑战和禁止。
  • 挑战与禁止之间的区别。

按租户配置的身份验证提供程序

ASP.NET Core没有用于多租户身份验证的内置解决方案。 虽然客户可以使用内置功能编写一个,但我们建议客户考虑使用 Orchard CoreABP FrameworkFinbuckle.MultiTenant 进行多租户身份验证。

Orchard Core 是:

  • 使用 ASP.NET Core构建的开源、模块化和多租户应用框架。
  • 基于该应用框架生成的内容管理系统 (CMS)。

有关每个租户的身份验证提供程序示例,请参阅 Orchard Core 源。

ABP Framework 支持各种体系结构模式,包括模块化、微服务、域驱动设计和多租户。 请参阅 GitHub 上的 ABP Framework 源代码

Finbuckle.MultiTenant:

  • 开放源代码
  • 提供租户解决方案
  • 轻型
  • 提供数据隔离
  • 为每个租户单独配置应用行为

其他资源

By Mike Rousos

身份验证是确定用户标识的过程。 Authorization是确定用户是否具有资源访问权限的过程。 在 ASP.NET Core 中,身份验证由身份验证服务IAuthenticationService处理,并由身份验证中间件中间件使用。 身份验证服务会使用已注册的身份验证处理程序来完成与身份验证相关的操作。 与身份验证相关的操作示例包括:

  • 对用户进行身份验证。
  • 当未经身份验证的用户尝试access受限资源时做出响应。

已注册的身份验证处理程序及其配置选项被称为“方案”。

在 中通过注册身份验证服务来指定身份验证方案。

  • 方式是在调用 后调用方案特定的扩展方法(例如 或 )。 这些扩展方法使用 将方案注册到合适的设置中。
  • 不太常用的方法是直接调用 。

例如,下列代码会为 和 JWT 持有者身份验证方案注册身份验证服务和处理程序:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
        options => builder.Configuration.Bind("JwtSettings", options))
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
        options => builder.Configuration.Bind("CookieSettings", options));

参数 是方案的名称,未请求特定方案时会默认使用此名称。

如果使用了多个方案,授权策略(或授权属性)可指定对用户进行身份验证时要依据的一个或多个身份验证方案。 在上例中,可通过指定 身份验证方案的名称来使用该方案(默认为 ,但也可在调用 时提供其他名称)。

在某些情况下,其他扩展方法会自动调用 。 例如,使用 ASP.NET Core Identity 时,AddAuthentication在内部调用。

通过调用 ,在 中添加身份验证中间件。 如果调用 ,会注册使用之前注册的身份验证方案的中间件。 在任何依赖用户身份验证的中间件之前调用 。

身份验证概念

身份验证负责提供 以进行授权,从而针对其做出权限决策。 可通过多种身份验证方案方法来选择使用哪种身份验证处理程序负责生成正确的声明集:

  • 身份验证方案
  • 默认身份验证方案,将在下一节中讨论。
  • 直接设置 。

不会自动探测方案。 如果未指定默认方案,则必须在授权属性中指定该方案,否则将引发以下错误:

InvalidOperationException:未指定 authenticationScheme,且未找到 DefaultAuthenticateScheme。 可使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(ActionAuthenticationOptions configureOptions) 设置默认方案。

身份验证方案

身份验证方案可选择使用哪种身份验证处理程序负责生成正确的声明集。 有关详细信息,请参阅使用特定方案授权。

身份验证方案是与下列项相对应的名称:

  • 身份验证处理程序。
  • 用于配置该处理程序特定实例的选项。

方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。 例如,授权策略可使用方案名称来指定应使用哪种(或哪些)身份验证方案来对用户进行身份验证。 配置身份验证时,通常是指定默认身份验证方案。 除非资源请求了特定方案,否则使用默认方案。 还可以做到:

  • 指定其他默认方案供授权、挑战和禁止操作使用。
  • 可通过策略方案将多个方案合成一个。

身份验证处理程序

身份验证处理程序:

  • 是一种实现某个方案行为的类型。
  • 派生自 或 。
  • 具有对用户进行身份验证的主要责任。

根据身份验证方案的配置和传入的请求上下文,身份验证处理程序:

  • 构造表示用户标识(如果身份验证成功)的 对象。
  • 返回“无结果”或“失败”(若身份验证失败)。
  • 当用户尝试访问资源时,采用的方法来挑战和禁止这些操作:
    • 他们没有权限访问(禁止)。
    • 他们未经过身份验证(挑战)。

是需要远程身份验证步骤的身份验证类。 远程身份验证步骤完成后,处理程序将调用其所设置的 。 处理程序使用传递给 回调路径的信息完成身份验证步骤。 OAuth 2.0OIDC都使用此模式。 JWT 和 Cookie 不使用此模式,因为它们可以直接使用持有者标头和 进行身份验证。 在这种情况下,托管在远程服务器上的提供商:

  • 是身份验证提供程序。
  • 示例包括 Facebook、Twitter、Google、Microsoft 和任何其他使用处理程序机制处理用户身份验证的 OIDC 提供程序。

认证

身份验证方案的身份验证操作负责基于请求上下文构造用户的标识。 它返回一个 ,指示身份验证是否成功,如果是,则返回身份验证票证中的用户标识。 请参阅 。 身份验证示例包括:

  • 身份验证方案,用于从 Cookie 构造用户的标识。
  • 对 JWT 持有者令牌进行反序列化和验证以构造用户身份的 JWT 持有者方案。

挑战

当未经身份验证的用户请求要求身份验证的终结点时,授权会发起身份验证挑战。 例如,当匿名用户请求受限资源或访问登录链接时,会引发身份验证挑战。 授权会使用指定的身份验证方案启动质询请求过程,如果没有指定,则使用默认方案。 请参阅 。 身份验证挑战示例包括:

  • 将用户重定向到登录页面的 身份验证方案。
  • JWT 承载者方案返回带有 标头的 401 状态码结果。

质询操作应让用户知道访问所请求资源的身份验证机制。

禁止

当经过身份验证的用户尝试访问其无权访问的资源时,授权将调用身份验证方案的禁止操作。 请参阅 。 身份验证禁止示例包括:

  • cookie身份验证方案,将用户重定向到一个指示禁止访问的页面。
  • JWT持有者身份验证方案返回403结果。
  • 自定义身份验证方案将用户重定向到一个页面,用户可以在该页面请求资源的访问权限。

用户可通过禁止操作知道:

  • 他们已经过身份验证。
  • 他们不被允许访问请求的资源。

请查看以下链接,了解挑战与禁止之间区别:

  • 使用操作资源处理程序的挑战和禁止。
  • 挑战与禁止之间的区别。

按租户配置的身份验证提供程序

ASP.NET Core没有用于多租户身份验证的内置解决方案。 虽然客户可以使用内置功能编写一个,但建议客户考虑使用多租户身份验证Orchard CoreABP Framework

Orchard Core 是:

  • 使用 ASP.NET Core构建的开源、模块化和多租户应用框架。
  • 基于该应用框架生成的内容管理系统 (CMS)。

请参阅 Orchard Core 源代码以查看每个租户的身份验证提供程序示例。

ABP Framework 支持各种体系结构模式,包括模块化、微服务、域驱动设计和多租户。 请参阅 GitHub 上的 ABP Framework 源代码

其他资源

By Mike Rousos

身份验证是确定用户标识的过程。 Authorization是确定用户是否具有资源访问权限的过程。 在 ASP.NET Core 中,身份验证由身份验证服务IAuthenticationService处理,并由身份验证中间件中间件使用。 身份验证服务会使用已注册的身份验证处理程序来完成与身份验证相关的操作。 与身份验证相关的操作示例包括:

  • 对用户进行身份验证。
  • 当未经身份验证的用户尝试access受限资源时做出响应。

已注册的身份验证处理程序及其配置选项被称为“方案”。

在 中通过注册身份验证服务来指定身份验证方案。

  • 方式是在调用 后调用方案特定的扩展方法(例如 或 )。 这些扩展方法使用 将方案注册到合适的设置中。
  • 不太常用的方法是直接调用 。

例如,下列代码会为 和 JWT 持有者身份验证方案注册身份验证服务和处理程序:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
        options => Configuration.Bind("JwtSettings", options))
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
        options => Configuration.Bind("CookieSettings", options));

参数 是方案的名称,未请求特定方案时会默认使用此名称。

如果使用了多个方案,授权策略(或授权属性)可指定对用户进行身份验证时要依据的一个或多个身份验证方案。 在上例中,可通过指定 身份验证方案的名称来使用该方案(默认为 ,但也可在调用 时提供其他名称)。

在某些情况下,其他扩展方法会自动调用 。 例如,使用 ASP.NET Core Identity 时,AddAuthentication在内部调用。

通过调用 ,在 中添加身份验证中间件。 如果调用 ,会注册使用之前注册的身份验证方案的中间件。 在任何依赖用户身份验证的中间件之前调用 。 如果使用终结点路由,则必须按以下顺序调用 :

  • 在 之后调用,以便路由信息可用于身份验证决策。
  • 在 之前调用,以确保用户在访问终结点之前已通过身份验证。

身份验证概念

身份验证负责提供 以进行授权,从而针对其做出权限决策。 可通过多种身份验证方案方法来选择使用哪种身份验证处理程序负责生成正确的声明集:

  • 身份验证方案
  • 默认身份验证方案,将在下一节中讨论。
  • 直接设置 。

不会自动探测方案。 如果未指定默认方案,则必须在授权属性中指定该方案,否则将引发以下错误:

InvalidOperationException:未指定 authenticationScheme,且未找到 DefaultAuthenticateScheme。 可使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(ActionAuthenticationOptions configureOptions) 设置默认方案。

身份验证方案

身份验证方案可选择使用哪种身份验证处理程序负责生成正确的声明集。 有关详细信息,请参阅使用特定方案授权。

身份验证方案是与下列项相对应的名称:

  • 身份验证处理程序。
  • 用于配置该处理程序特定实例的选项。

方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。 例如,授权策略可使用方案名称来指定应使用哪种(或哪些)身份验证方案来对用户进行身份验证。 配置身份验证时,通常是指定默认身份验证方案。 除非资源请求了特定方案,否则使用默认方案。 还可以做到:

  • 指定其他默认方案供授权、挑战和禁止操作使用。
  • 可通过策略方案将多个方案合成一个。

身份验证处理程序

身份验证处理程序:

  • 是一种实现某个方案行为的类型。
  • 派生自 或 。
  • 具有对用户进行身份验证的主要责任。

根据身份验证方案的配置和传入的请求上下文,身份验证处理程序:

  • 构造表示用户标识(如果身份验证成功)的 对象。
  • 返回“无结果”或“失败”(若身份验证失败)。
  • 当用户尝试访问资源时,采用的方法来挑战和禁止这些操作:
    • 他们没有权限访问(禁止)。
    • 他们未经过身份验证(挑战)。

是需要远程身份验证步骤的身份验证类。 远程身份验证步骤完成后,处理程序将调用其所设置的 。 处理程序使用传递给 回调路径的信息完成身份验证步骤。 OAuth 2.0OIDC都使用此模式。 JWT 和 Cookie 不使用此模式,因为它们可以直接使用持有者标头和 进行身份验证。 在这种情况下,托管在远程服务器上的提供商:

  • 是身份验证提供程序。
  • 示例包括 Facebook、Twitter、Google、Microsoft 和任何其他使用处理程序机制处理用户身份验证的 OIDC 提供程序。

认证

身份验证方案的身份验证操作负责基于请求上下文构造用户的标识。 它返回一个 ,指示身份验证是否成功,如果是,则返回身份验证票证中的用户标识。 请参阅 。 身份验证示例包括:

  • 身份验证方案,用于从 Cookie 构造用户的标识。
  • 对 JWT 持有者令牌进行反序列化和验证以构造用户身份的 JWT 持有者方案。

挑战

当未经身份验证的用户请求要求身份验证的终结点时,授权会发起身份验证挑战。 例如,当匿名用户请求受限资源或访问登录链接时,会引发身份验证挑战。 授权会使用指定的身份验证方案启动质询请求过程,如果没有指定,则使用默认方案。 请参阅 。 身份验证挑战示例包括:

  • 将用户重定向到登录页面的 身份验证方案。
  • JWT 承载者方案返回带有 标头的 401 状态码结果。

质询操作应让用户知道访问所请求资源的身份验证机制。

禁止

当经过身份验证的用户尝试访问其无权访问的资源时,授权将调用身份验证方案的禁止操作。 请参阅 。 身份验证禁止示例包括:

  • cookie身份验证方案,将用户重定向到一个指示禁止访问的页面。
  • JWT持有者身份验证方案返回403结果。
  • 自定义身份验证方案将用户重定向到一个页面,用户可以在该页面请求资源的访问权限。

用户可通过禁止操作知道:

  • 他们已经过身份验证。
  • 他们不被允许访问请求的资源。

请查看以下链接,了解挑战与禁止之间区别:

  • 使用操作资源处理程序的挑战和禁止。
  • 挑战与禁止之间的区别。

按租户配置的身份验证提供程序

ASP.NET Core框架没有用于多租户身份验证的内置解决方案。 尽管客户可以编写具有多租户身份验证的应用,但我们建议使用以下支持多租户身份验证的应用程序框架 ASP.NET Core之一。

Orchard Core是一个开放源代码、模块化和多租户应用框架,构建了 ASP.NET Core,还提供内容管理系统(CMS)。 请参阅 Orchard Core 源代码以查看每个租户的身份验证提供程序示例。

ABP 框架 支持各种体系结构模式,包括模块化、微服务、域驱动设计和多租户。 请参阅 GitHub 上的 ABP Framework 源代码

其他资源