在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API。 使用IdentityServer4 来实现使用客户端凭据保护ASP.NET Core Web API 访问。 IdentityServer4 GitHub: https://github.com/IdentityServer/IdentityServer4 IdentityServer 框架支持以下功能: 身份验证服务 单点登录/退出 API的访问控制 联合登录 专注于定制
IdentityServer实现了以下规范: OpenID ConnectOpenID Connect Core 1.0 OAuth 2.0OAuth 2.0 (RFC 6749)
主要讲解 使用客户端凭据保护API 。如何保证的你的API 不被其他人擅自访问? 下面开始正式的实例。 新建ASP.NET Core项目及引用IdentityServer4首先新建一个ASP.NET Core项目IdentityServer4Demo,然后选择 空 模板。
然后添加引用。 NuGet命令行:
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命令行:
首先更改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命令行:
客户端代码如下: 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 到这里就基本完成。 更多IdentityServer4信息:https://identityserver4.readthedocs.io/
最后更新于2016-11-07: 本文编写于RC2 版本。RC3版已更新,详细请查看官方文档。
如果你觉得本文对你有帮助,请点击“推荐”,谢谢。 |
请发表评论