IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API。
使用IdentityServer4 来实现使用客户端凭据保护ASP.NET Core Web API 访问。
IdentityServer4 GitHub: https://github.com/IdentityServer/IdentityServer4
IdentityServer 框架支持以下功能:
身份验证服务
所有应用程序(Web,本机,移动,服务)的集中登录逻辑和工作流。
单点登录/退出
对多种应用程序类型的单点登录和退出。
API的访问控制
针对各种类型的客户发出针对API的访问令牌,例如服务器到服务器,Web应用程序,SPA和本机/移动应用程序。
联合登录
支持外部身份提供程序,如Azure Active Directory,Google,Facebook等。
专注于定制
IdentityServer最重要的部分 - 许多方面可以定制,以满足你的需要。由于IdentityServer是一个框架,而不是一个封闭产品或SaaS,你可以编写代码,使你的系统适应对应的场景。
IdentityServer实现了以下规范:
OpenID Connect
OpenID Connect Core 1.0
OpenID Connect Discovery 1.0
OpenID Connect Session Management 1.0 - draft 22
OpenID Connect HTTP-based Logout 1.0 - draft 03
OAuth 2.0
OAuth 2.0 (RFC 6749)
OAuth 2.0 Bearer Token Usage (RFC 6750)
OAuth 2.0 Multiple Response Types
OAuth 2.0 Form Post Response Mode
OAuth 2.0 Token Revocation (RFC 7009)
OAuth 2.0 Token Introspection (RFC 7662)
Proof Key for Code Exchange (RFC 7636)
主要讲解 使用客户端凭据保护API 。如何保证的你的API 不被其他人擅自访问?
下面开始正式的实例。
新建ASP.NET Core项目及引用IdentityServer4
首先新建一个ASP.NET Core项目IdentityServer4Demo,然后选择 空 模板。
然后添加引用。
NuGet命令行:
Install-Package IdentityServer4 -Version 1.0.0-rc2 -Pre
IdentityServer4使用
添加好引用以后我们就可以来使用了。
首先创建一个 Config.cs 类。
定义范围:
public static IEnumerable<Scope> GetScopes() { return new List<Scope> { new Scope { Name = "zeroapi", Description = "LineZero ASP.NET Core Web API" } }; }
定义客户端:
public static IEnumerable<Client> GetClients() { return new List<Client> { new Client { ClientId = "linezeroclient", //使用clientid / secret进行身份验证 AllowedGrantTypes = GrantTypes.ClientCredentials, // 加密验证 ClientSecrets = new List<Secret> { new Secret("secret".Sha256()) }, // client可以访问的范围,在上面定义的。 AllowedScopes = new List<string> { "zeroapi" } } }; }
定义好以后,在Startup.cs 中 配置IdentityServer4
public void ConfigureServices(IServiceCollection services) { services.AddDeveloperIdentityServer() .AddInMemoryScopes(Config.GetScopes()) .AddInMemoryClients(Config.GetClients()); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseIdentityServer(); }
然后我们启动IdentityServer4Demo
访问:http://localhost:5000/.well-known/openid-configuration
IdentityServer 创建成功。
新建WebAPI项目
然后添加引用。
NuGet命令行:
Install-Package IdentityServer4.AccessTokenValidation -Version 1.0.1-rc2 -Pre
首先更改API 的URL地址,不和Server 重复。
这里改为 http://localhost:5001
public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseUrls("http://localhost:5001") .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); }
然后在Startup.cs 中 配置相关信息
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions { Authority = "http://localhost:5000", ScopeName = "zeroapi", RequireHttpsMetadata = false }); app.UseMvc(); }
注意:这里定义的授权地址是 http://localhost:5000
下面我们来定义API,添加一个Web API 控制器 ClientController
[Route("api/[controller]")] [Authorize] public class ClientController : Controller { [HttpGet] public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value }); } }
上面添加了 Authorize 特性,直接访问API 是无法访问的。
程序启动以后,访问http://localhost:5001/api/client 会返回401 。
客户端调用
创建一个客户端调用,添加一个控制台程序 Client。
首先也要添加引用:
NuGet命令行:
Install-Package IdentityModel
客户端代码如下:
public static void Main(string[] args) { //访问授权服务器获取token var disco = DiscoveryClient.GetAsync("http://localhost:5000").Result;
var tokenClient = new TokenClient(disco.TokenEndpoint, "linezeroclient", "secret");
var tokenResponse = tokenClient.RequestClientCredentialsAsync("zeroapi").Result;
if (tokenResponse.IsError) { Console.WriteLine(tokenResponse.Error); return; } Console.WriteLine(tokenResponse.Json); Console.WriteLine("=============================="); //设置token 访问API var client = new HttpClient(); client.SetBearerToken(tokenResponse.AccessToken); var response = client.GetAsync("http://localhost:5001/api/client").Result; if (!response.IsSuccessStatusCode) { Console.WriteLine(response.StatusCode); } var content = response.Content.ReadAsStringAsync().Result; Console.WriteLine(content); Console.ReadKey(); }
然后开始一个个运行。
首先启动 IdentityServer4Demo,然后API 然后Client。
Client 成功访问 API 。使用客户端凭据保护API 到这里就基本完成。