Identity Server 4 - Hybrid Flow - 保护API资源

这个系列文章介绍的是Identity Server 4 的 Hybrid Flow, 前两篇文章介绍了如何保护MVC客户端, 本文介绍如何保护API资源.html

保护MVC客户端的文章: http://www.javashuo.com/article/p-spxopsak-by.html,  http://www.javashuo.com/article/p-dwismktz-w.htmlgit

相关代码: https://github.com/solenovex/Identity-Server-4-Tutorial-Code 里面03那部分.github

 

回顾 Hybrid Flow

回顾一下该项目使用的流程api

图里有IDP (Identity Provider, 我例子里是用Identity Server 4构建的项目)和客户端(个人例子里是MVC客户端).ide

在上面流程走完以后, MVC客户端得到了Access Token, MVC客户端验证Access Token并成功后, 就可使用Access Token来访问被保护的API资源了, 而Access Token会在被保护的API那里再次进行验证.测试

 

保护API

首先在IDP里配置一个返回ApiResoruce的方法:ui

和IdentityResource相似, ApiResource就是与API相关的scopes.3d

 

在Client配置那里, 把这个ApiResource的名字添加到容许的scopes里:rest

 

最后在IDP的startup里, 注册ApiResources:server

 

如今来到MVC客户端这里, 须要把上面的scope添加上:

 

最后来到API项目, 首先确保使用HTTPS:

 

API项目还须要安装IdentityServer4.AccessTokenValidation这个包, 能够经过Nuget安装.

安装后, 还须要进行配置 (官方文档: https://identityserver4.readthedocs.io/en/release/quickstarts/1_client_credentials.html#adding-an-api): 

其中IdentityServerAuthenticationDefaults.AuthenticationScheme 就是 “Bearer” 的意思, 这里使用的就是这个方案.

AddIdentityServerAuthentication()方法注册了Access Token 验证的处理者. 里面Authority就是IDP的URI, ApiName就是IDP里配置的API的名字.

 

在Startup的Configure方法里, 还须要把它添加到管道:

要确保它在UseMVC以前调用.

 

我在API项目里使用过滤器为全部的Controller都加上了受权过滤:

固然也能够在具体的Controller或Action级写上这个:

不管如何如今访问Country资源是须要受权的.

 

回到MVC客户端, 在Home的Contact Action里调用CountryAPI资源:

 

 

下面测试一下未使用Access Token访问被保护的Country资源的状况, 从新操做能够看到用户赞成受权页面出现了刚才配置的API资源名:

在访问Contact页面的时候, 提示未受权:

 

那就用以前介绍过的方法来获取Access Token并设置Authorization Header为 “Bearer [AccessToken]” 便可:

 

再修改一下Contact页面, 显示Access Token:

 

从新操做, 就能够看到Country资源数据了:

 

Access Token

去jwt.io对Access Token进行解码:

看一下aud (audience, 观众) 这个属性, 它有两个值, 第一个是指IDP那边对资源 (调用用户信息端点), 第二个就是指API那个项目.

这个属性说明这个access token是为它们俩准备的.

而scope里面的“restapi”就是aud里面的“restapi”, 因此这个token容许被用来访问咱们的“restapi”.

而scope里面的“profile”等scopes是对应另外一个aud的值, 这些scopes来自IDP那里.

 

如今Access Token有这些claims, API也就能获得这些claims, 可是有时API还须要用户身份相关的claims.

修改IDP的ApiResource配置便可:

 

再次操做后, 查看token, 就能够看到我刚刚添加的那两个claim了:

 

而role这个claim, 在API里是能够被识别成角色的, 若是我在API的Action上设置权限以下:

那么, Nick这个用户就能够获得Country数据, 而Dave则会显示403 Forbidden:

相关文章
相关标签/搜索