asp.net core IdentityServer4 实现 Client credentials(客户端凭证)
前言
oauth 2.0默认四种授权模式(granttype)
- 授权码模式(authorization_code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
本章主要介绍客户端模式(client credentials)
,他主要是由两部分构成客户端和认证服务器.
认证服务器在确定客户端信息无误后向客户端返回token,客户端请求资源时带着该token进行访问.(在这种模式中用户可直接向客户端注册,客户端再以自己的名义请求认证服务器)
搭建认证服务器
创建一个api项目工程,端口设置为5000
package
pm> install-package identityserver4 -version 2.5.3
创建一个类config(配置要保护的资源和可以访问该api的客户端服务器)
/// <summary> /// identity配置 /// </summary> public class config { /// <summary> /// 定义要保护的资源 /// </summary> /// <returns></returns> public static ienumerable<apiresource> getapiresources() { return new list<apiresource> { new apiresource("api1", "my api") }; } /// <summary> /// 定义授权客户端 /// </summary> /// <returns></returns> public static ienumerable<client> getclients() { return new list<client> { new client() { clientid = "client", allowedgranttypes = granttypes.clientcredentials, //设置模式,客户端模式 clientsecrets = { new secret("secret".sha256()) }, allowedscopes = { "api1" } } }; } }
配置startup
在configureservices方法中注入identityserver4服务
public void configureservices(iservicecollection services) { services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2); services.addidentityserver()//identityserver4服务 .adddevelopersigningcredential() .addinmemoryapiresources(config.getapiresources()) //配置资源 .addinmemoryclients(config.getclients());//把配置文件的client配置资源放到内存 }
在configure方法中添加identityserver4服务中间件
app.useidentityserver();
搭建 api resource
创建一个客户端工程项目,端口设置为5001
package
pm> install-package identityserver4.accesstokenvalidation -version 2.7.0
配置startup
在configureservices添加认证服务器地址
public void configureservices(iservicecollection services) { services.addauthentication("bearer") .addidentityserverauthentication(options => { options.authority = "http://localhost:5000";//授权服务器地址 options.requirehttpsmetadata = false;//不需要https options.apiname = "api1"; }); services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2); }
在configure方法中添加identityserver4服务中间件
app.useidentityserver();
测试
在客户端values控制器上面增加[authorize]
直接访问资源服务器http://localhost:5001/api/values
访问受限了 code 401
启动授权服务器
发现端点可通过/.well-known/openid-configuration
获取token
启动后我们通过token_endpoint获取token
client_id为我们在授权服务器配置的clientid,
client_secret为配置中的secret,
grant_type为授权模式此处为客户端模式(client_credentials),
请求后返回凭证信息,
我们通过access_token再去访问资源服务器
使用这种授权类型,会向token 。
code 200
概要
示例地址:https://github.com/fhcodegit/identityserver4.samples
identityserver4叙述: