适用于云原生应用程序的 IdentityServer
提示
Azure 平台的云原生 .NET 应用电子书封面缩略图。
IdentityServer 是一种身份验证服务器,用于实现 ASP.NET Core 的 OpenID Connect(OIDC)和 OAuth 2.0 标准。 它旨在提供一种对所有应用程序(无论是 Web、本机、移动还是 API 终结点)的请求进行身份验证的常见方法。 IdentityServer 可用于为多个应用程序和应用程序类型实现单一 Sign-On(SSO)。 它可以用于通过登录表单和类似用户界面对实际用户进行身份验证,也可以用于无需用户界面的服务端验证,这种验证通常包括令牌的颁发、验证和续订。 IdentityServer 设计为可自定义的解决方案。 每个实例通常都是自定义的,以满足单个组织和/或一组应用程序的需求。
常见网页应用场景
通常,应用程序需要支持以下某些或全部方案:
- 使用浏览器访问 Web 应用程序的人类用户。
- 通过基于浏览器的应用程序访问后端 Web API 的人类用户。
- 通过移动/原生客户端访问后端 Web API 的人类用户。
- 访问后端 Web API 的其他应用程序(没有活动用户或用户界面)。
- 任何应用程序可能需要使用自己的标识与其他 Web API 交互,或者委托给用户的标识。
图 8-1。 应用程序类型和方案。
在上述每个方案中,需要保护公开的功能免受未经授权的使用。 这至少需要对发出资源请求的用户或主体进行身份验证。 此身份验证可以使用多个常见协议之一,例如 SAML2p、WS-Fed 或 OpenID Connect。 与 API 通信通常使用 OAuth2 协议及其对安全令牌的支持。 将这些关键的跨领域安全问题及其实现细节与应用程序本身分离,可确保一致性并提高安全性和可维护性。 将这些担忧外包给 IdentityServer 等专用产品有助于要求每个应用程序自行解决这些问题。
IdentityServer 提供在 ASP.NET Core 应用程序中运行的中间件,并添加了对 OpenID Connect 和 OAuth2 的支持(请参阅 支持的规范)。 组织将使用 IdentityServer 中间件创建自己的 ASP.NET 核心应用,充当其所有基于令牌的安全协议的 STS。 IdentityServer 中间件公开终结点以支持标准功能,包括:
- 授权(对最终用户进行身份验证)
- 令牌(以编程方式请求令牌)
- 发现(有关服务器的元数据)
- 用户信息(获取具有有效访问令牌的用户信息)
- 设备授权(用于启动设备流授权)
- 自检(令牌验证)
- 吊销(令牌吊销)
- 结束会话(跨所有应用触发单一注销)
快速入门
IdentityServer 可用:
- 使用社区许可证,可以将 IdentityServer 免费用于小公司和非营利组织(附带条件)
- 付费版,让你可以在商业场景中使用 IdentityServer
有关定价的详细信息,请参阅官方产品的 定价页。
可以使用其 NuGet 包将其添加到应用程序。 主包 IdentityServer,该包已下载超过 400 万次。 基本包不包含任何用户界面代码,仅支持内存中配置。 若要将其与数据库配合使用,还需要一个数据提供程序,例如 Duende.IdentityServer.Storage,后者使用 Entity Framework Core 存储 IdentityServer 的配置和作数据。 对于用户界面,可以将文件从 快速入门 UI 存储库 复制到 ASP.NET Core MVC 应用程序中,以添加对使用 IdentityServer 中间件登录和注销的支持。
配置
IdentityServer 支持不同类型的协议和社交身份验证提供程序,这些协议和社交身份验证提供程序可以配置为每个自定义安装的一部分。 这通常在 ASP.NET Core 应用程序的 Program
类(或在 ConfigureServices
方法的 Startup
类中完成)。 配置涉及指定支持的协议以及要使用的服务器和终结点的路径。 图 8-2 显示了从适用于 ASP.NET Core 应用程序的 IdentityServer 快速入门项目中提取的示例配置。
// some details omitted
builder.Services.AddIdentityServer();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddGoogle("Google", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "<insert here>";
options.ClientSecret = "<insert here>";
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://localhost:5001";
options.ClientId = "web";
options.ClientSecret = "secret";
options.ResponseType = "code";
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.MapInboundClaims = false; // Don't rename claim types
options.SaveTokens = true;
});
}
图 8-2。 配置 IdentityServer。
JavaScript 客户端
许多云原生应用程序在前端使用服务器端 API 和丰富的客户端单页应用程序(SPA)。 IdentityServer 通过 NPM 提供 JavaScript 客户端(oidc-client.js
),可将其添加到 SPA,使其能够使用 IdentityServer 进行 Web API 的登录、注销和基于令牌的身份验证。 此外,可以使用用于前端的后端 (BFF) 来实现与令牌服务器的所有安全协议交互,以及 IETF 的 OAuth 2.0 for Browser-Based Applications 规范。