IdentityServer4 是一个用于 ASP.NET Core 的 OpenID Connect 和 OAuth 2.0 框架,它可以帮助你实现身份验证和授权功能。本文将介绍如何在 IdentityServer4 中入门,并演示如何为 API 添加客户端凭据。
IdentityServer4 是一个开源的身份验证和授权框架,它实现了 OpenID Connect 和 OAuth 2.0 协议。它可以帮助你构建安全的身份验证和授权系统,允许客户端应用程序(如 Web 应用、移动应用等)通过令牌(Token)来访问受保护的资源。
OAuth 2.0 是一个授权框架,它允许第三方应用程序在用户授权的情况下访问用户的资源。OAuth 2.0 主要用于授权,而不是身份验证。
OpenID Connect 是建立在 OAuth 2.0 之上的身份验证协议。它扩展了 OAuth 2.0,允许客户端应用程序验证用户的身份,并获取用户的基本信息。
IdentityServer4 实现了这两个协议,因此你可以使用它来构建一个完整的身份验证和授权系统。
要开始使用 IdentityServer4,首先需要创建一个 ASP.NET Core 项目,并安装 IdentityServer4 的 NuGet 包。
你可以使用 Visual Studio 或者 .NET CLI 来创建一个新的 ASP.NET Core 项目。
dotnet new webapi -n IdentityServerDemo cd IdentityServerDemo
接下来,安装 IdentityServer4 的 NuGet 包:
dotnet add package IdentityServer4
在安装完 IdentityServer4 后,你需要在 Startup.cs
文件中配置 IdentityServer4。
在 Startup.cs
文件的 ConfigureServices
方法中,添加 IdentityServer4 的服务配置:
public void ConfigureServices(IServiceCollection services) { services.AddIdentityServer() .AddDeveloperSigningCredential() // 用于开发环境的签名凭据 .AddInMemoryApiResources(Config.GetApiResources()) // 添加 API 资源 .AddInMemoryClients(Config.GetClients()); // 添加客户端 }
在上面的代码中,我们使用了 Config.GetApiResources()
和 Config.GetClients()
方法来获取 API 资源和客户端配置。你可以在项目中创建一个 Config
类来定义这些配置。
public static class Config { public static IEnumerable<ApiResource> GetApiResources() { return new List<ApiResource> { new ApiResource("api1", "My API") }; } public static IEnumerable<Client> GetClients() { return new List<Client> { new Client { ClientId = "client", AllowedGrantTypes = GrantTypes.ClientCredentials, ClientSecrets = { new Secret("secret".Sha256()) }, AllowedScopes = { "api1" } } }; } }
在这个配置中,我们定义了一个 API 资源 api1
和一个客户端 client
。客户端使用客户端凭据(Client Credentials)授权类型,并且只能访问 api1
资源。
在 Startup.cs
文件的 Configure
方法中,添加 IdentityServer4 的中间件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseIdentityServer(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
接下来,我们将创建一个受保护的 API,客户端需要使用有效的令牌来访问这个 API。
在项目中创建一个新的控制器 ValuesController
:
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet] [Authorize] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value2" }; } }
在这个控制器中,我们使用了 [Authorize]
属性来保护 Get
方法。只有携带有效令牌的请求才能访问这个方法。
在 Startup.cs
文件的 ConfigureServices
方法中,添加身份验证服务:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication("Bearer") .AddJwtBearer("Bearer", options => { options.Authority = "https://localhost:5001"; // IdentityServer4 的地址 options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false }; }); services.AddAuthorization(options => { options.AddPolicy("ApiScope", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "api1"); }); }); services.AddControllers(); }
在这个配置中,我们使用了 JWT Bearer 身份验证方案,并指定了 IdentityServer4 的地址。我们还定义了一个名为 ApiScope
的授权策略,要求用户必须经过身份验证,并且拥有 api1
的 scope。
在 ValuesController
中,我们可以应用 ApiScope
授权策略:
[Route("api/[controller]")] [ApiController] [Authorize(Policy = "ApiScope")] public class ValuesController : ControllerBase { [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value2" }; } }
现在,我们已经完成了 IdentityServer4 和受保护 API 的配置。接下来,我们将测试客户端凭据授权。
首先,我们需要使用客户端凭据来获取访问令牌。你可以使用 Postman 或者任何 HTTP 客户端来发送请求。
请求 URL: https://localhost:5001/connect/token
请求方法: POST
请求头:
Content-Type: application/x-www-form-urlencoded
请求体:
grant_type=client_credentials client_id=client client_secret=secret
发送请求后,你将获得一个访问令牌:
{ "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ij...", "expires_in": 3600, "token_type": "Bearer" }
接下来,使用获取到的访问令牌来访问受保护的 API。
请求 URL: https://localhost:5001/api/values
请求方法: GET
请求头:
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ij...
发送请求后,你将获得 API 的响应:
[ "value1", "value2" ]
在本文中,我们介绍了如何在 IdentityServer4 中入门,并演示了如何为 API 添加客户端凭据。通过配置 IdentityServer4 和受保护的 API,你可以轻松地实现身份验证和授权功能。希望本文对你有所帮助,祝你在使用 IdentityServer4 的过程中取得成功!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。