Oatuth2协议的客户端模式介绍
Client Credentials Grant (客户端模式)是Oauth2.0协议中,四种模式自建单的一种。它由两部分构成,客户端和认证服务器。认证服务器确认客户端无误后返回一个token,客户端请求带着token访问资源。(一般使用场景是在一个安全的环境下,例如我的同一个系统中,一个api请求另外一个api)。
这里借用下阮一峰老师画的图(博客地址=》http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
IdentityServer4客户端模式实现
首先我们创建一个core的api项目作为认证服务器,添加nuget程序包IdentityServer4,将启动端口设置为5000。
接下来添加一个类,取名字叫做Config,我们用它来初始化Identityserver(配置要保护的资源和可以访问该API的客户端服务器)。
代码如下:
/// <summary>/// Idnetity配置,初始化Identityserver/// </summary>public class Config{//定义要保护的资源(webapi)public static IEnumerable<ApiResource> GetApiResources(){return new List<ApiResource>{new ApiResource("api1", "My API")};}//定义可以访问该API的客户端public static IEnumerable<Client> GetClients(){return new List<Client>{new Client(){ClientId = "client",AllowedGrantTypes = GrantTypes.ClientCredentials, //设置模式,客户端模式ClientSecrets ={new Secret("secret".Sha256())},AllowedScopes = { "api1" }}};}}
接下来配置startup,将资源和客户端的初始信息服务加入到DI容器,同时引用IdentityServer中间件。代码如下所示:
public void ConfigureServices(IServiceCollection services){services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryApiResources(Config.GetApiResources()) //配置资源.AddInMemoryClients(Config.GetClients()); //配置客户端services.AddMvc();}public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}//使用identityserver中间件app.UseIdentityServer();app.UseMvc();}
再添加一个webapi项目,作为我们的资源服务器。添加nuget包,IdentityServer4.AccessTokenValidation,将启动端口设置为5001。
2、配置startup,添加认证服务器地址,和apiname &&引用中间件,代码如下:
public void ConfigureServices(IServiceCollection services){services.AddAuthentication("Bearer").AddIdentityServerAuthentication(options =>{options.Authority = "http://localhost:5000"; //配置Identityserver的授权地址options.RequireHttpsMetadata = false; //不需要httpsoptions.ApiName = "api1"; //api的name,需要和config的名称相同});services.AddMvc();}public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseAuthentication();// 添加认证中间件app.UseMvc();}
将受保护资源controller添加[Authorize]。(因为资源服务器AddIdentityServerAuthentication 方法的参数和返回值都是AuthenticationBuilder(类似于一个中间件),所以可以多次调用AddIdentityServerAuthentication方法来控制这个api 资源可以让谁访问到。)
最开始我们直接访问资源服务器的api,返回401,因为我们的资源被保护了。
这时候来到IdentityServer4的官网,官网给出了这么一个地址=》
我们访问这个地址时候,它会返回我们的Config配置=》
其中有一个token_endpoint的url地址,我们带着Client的配置来访问它=》
此时拿到Token,再带着token去访问我们的资源,争取获取到资源数据=》
https://github.com/conanl5566/dotnet-core-Example/tree/master/WebApplication25