原文参考:Switching to Hybrid Flow and adding API Access back
接上篇:IdentityServer-Protecting an API using Client Credentials
首先配置OpenID:
原文参考:Adding User Authentication with OpenID Connect
下载相关UI:Quickstart UI repo
下载下来后主要有3个文件夹
需要把前面两个文件夹的部分内容复制到项目中
Quickstart目录中复制如下内容
Views目录中复制如下内容
Shared目录中只需要复制一个文件
复制完成后将上面的类除Controller外统一修改命名空间:【项目名称】.Models
Controller类修改命名空间:【项目名称】.Controllers
目的是在Views中不需要在引入命名空间,因为原来的Views\_ViewImports.cshtml 中有引用
接下来配置Client进行测试
在postman中测试Hybrid模式需要注意加上scope,否则会报错
在配置Client的时候可以设置是否启用提示页:
new Client { ClientId = "mvc", ClientName = "MVC Client", AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, RequireConsent = false, ClientSecrets = { new Secret("secret".Sha256()) }, RedirectUris = { "http://localhost:5002/signin-oidc" }, PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" }, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "api1" }, AllowOfflineAccess = true }
RequireConsent=false表示不显示提示直接授权通过。
代码地址:IdentityCenter
将IdentityCenter和API放在同一个项目中,修改startup
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
services.AddAuthentication() .AddJwtBearer(jwt => { jwt.Authority = "http://localhost:5000"; jwt.RequireHttpsMetadata = false; jwt.Audience = "api1"; });
新建一个测试Controller
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
namespace IdentityCenter.API { [Produces("application/json")] [Route("api/Identity")] //[Authorize] public class IdentityController : Controller { // GET: api/Identity [HttpGet] [Authorize(AuthenticationSchemes = "Bearer")] public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value }); } // GET: api/Identity/5 [HttpGet("{id}", Name = "Get")] public string Get(int id) { return "value"; } } }
这里要指定[Authorize(AuthenticationSchemes = "Bearer")]
而不能仅仅使用[Authorize]
当然,如果把startup中的代码改下
services.AddAuthentication("Bearer")
那么可以直接使用[Authorize]
这样就可以使用token访问此API
还有一点要注意的是如果把认证中心部署在另外一台机器上,比如放在CentOS中
那么jwt.Authority = "http://10.202.203.29:5000"; 这里一定要使用具体的IP地址,否则会出现可以获取token,但无法通过授权
这里在https://identityserver4.readthedocs.io/en/release/endpoints/discovery.html 有说明