适用于云原生应用程序的 IdentityServer

提示

此内容摘自电子书《为 Azure 构建云原生 .NET 应用程序》,可在 .NET 文档上获取,也可作为免费可下载的 PDF 脱机阅读。

Cloud Native .NET apps for Azure eBook cover thumbnail.

IdentityServer 是一种身份验证服务器,用于实现针对 ASP.NET Core 的 OpenID Connect (OIDC) 和 OAuth 2.0 标准。 它旨在提供一种通用方法来对所有应用程序的请求进行身份验证,无论这些请求是 Web、本机、移动还是 API 终结点。 可以使用 IdentityServer 为多个应用程序和应用程序类型实现单一登录 (SSO)。 它可用于通过登录窗体和类似用户界面以及基于服务的身份验证(通常涉及令牌颁发、验证和续订,无需任何用户界面)对实际用户进行身份验证。 IdentityServer 旨在作为可自定义的解决方案。 通常,每个实例都进行自定义,以适应单个组织和/或一组应用程序的需求。

常见的 Web 应用场景

通常,应用程序需要支持以下部分或所有场景:

  • 人类用户使用浏览器访问 Web 应用程序。
  • 人类用户从基于浏览器的应用访问后端 Web API。
  • 人类用户在移动/本机客户端上访问后端 Web API。
  • 其他应用程序访问后端 Web API(无需使用活动的用户或用户界面)。
  • 任何应用程序都可能需要使用其自己的标识或委托给用户的标识,与其他 Web API 交互。

Application types and scenarios

图 8-1。 应用程序类型和场景。

在上述每种情况下,都需要确保公开的功能不受未经授权的使用。 至少,这通常需要对请求资源的用户或主体进行身份验证。 此身份验证可使用几种常用协议,如 SAML2p、WS-Fed 或 OpenID Connect。 与 API 通信通常使用 OAuth2 协议及其对安全令牌的支持。 将这些关键的交叉安全性问题及其实现细节与应用程序本身分离,可确保一致性并提高安全性和可维护性。 将这些问题外包给专用产品(如 IdentityServer)有助于每个应用程序的要求自行解决这些问题。

IdentityServer 提供在 ASP.NET Core 应用程序中运行的中间件并添加针对 OpenID Connect 和 OAuth2 的支持(请参阅支持的规范)。 组织将使用 IdentityServer 中间件创建自己的 ASP.NET Core 应用,以充当其所有基于令牌的安全协议的 STS。 IdentityServer 中间件公开终结点以支持标准功能,其中包括:

  • 授权(对最终用户进行身份验证)
  • 令牌(以编程方式请求令牌)
  • 发现(有关服务器的元数据)
  • 用户信息(使用有效的访问令牌获取用户信息)
  • 设备授权(用于启动设备流授权)
  • 自检(令牌验证)
  • 吊销(令牌吊销)
  • 结束会话(在所有应用中触发单一注销)

入门

IdentityServer4 在双重许可证下可用:

  • RPL - 如果在开源工作中使用,支持免费使用 IdentityServer4
  • 付费 - 支持在商业场景中使用 IdentityServer4

有关定价的更多信息,请参阅官方产品的定价页

可以使用它的 NuGet 包将它添加到应用程序。 主包是 IdentityServer4,已下载超过四百万次。 基包不包含任何用户界面代码,并且仅支持内存中的配置。 如果要将其用于数据库,你还需要使用 IdentityServer4.EntityFramework 等数据提供程序,该提供程序使用 Entity Framework Core 存储 IdentityServer 的配置和操作数据。 对于用户界面,可以将文件从 Quickstart UI 存储库复制到 ASP.NET Core MVC 应用程序,以使用 IdentityServer 中间件添加对登录和注销的支持。

配置

IdentityServer 支持不同种类的协议和社交身份验证提供程序,这些提供程序可配置为每个自定义安装的一部分。 这通常在 ASP.NET Core 应用程序的 Program 类(或 ConfigureServices 方法的 Startup 类)中完成。 此配置涉及到指定支持的协议以及将使用的服务器和终结点的路径。 图 8-2 显示从 IdentityServer4 Quickstart UI 项目获取的示例配置:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // some details omitted
        services.AddIdentityServer();

          services.AddAuthentication()
            .AddGoogle("Google", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                options.ClientId = "<insert here>";
                options.ClientSecret = "<insert here>";
            })
            .AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                options.Authority = "https://demo.identityserver.io/";
                options.ClientId = "implicit";
                options.ResponseType = "id_token";
                options.SaveTokens = true;
                options.CallbackPath = new PathString("/signin-idsrv");
                options.SignedOutCallbackPath = new PathString("/signout-callback-idsrv");
                options.RemoteSignOutPath = new PathString("/signout-idsrv");

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role"
                };
            });
    }
}

图 8-2。 配置 IdentityServer。

JavaScript 客户端

许多云原生应用程序使用服务器端 API 和前端丰富的客户端单页应用程序 (SPA)。 IdentityServer 通过 NPM 附带了 JavaScript 客户端 (oidc-client.js),可添加到 SPA,以使它们可以将 IdentityServer 用于 Web API 的登录、注销和基于令牌的身份验证。

参考