欢迎光临
我的个人博客网站

IdentityServer4 (5) 混合模式(Hybrid)


写在前面

1、源码(.Net Core 2.2)

  git地址:https://github.com/yizhaoxian/CoreIdentityServer4Demo.git

2、相关章节

  2.1、《IdentityServer4 (1) 客户端授权模式(Client Credentials)
  2.2、《IdentityServer4 (2) 密码授权(Resource Owner Password)
  2.3、《IdentityServer4 (3) 授权码模式(Authorization Code)
  2.4、《IdentityServer4 (4) 静默刷新(Implicit)
  2.5、《IdentityServer4 (5) 混合模式(Hybrid)

3、参考资料

  IdentityServer4 中文文档 http://www.identityserver.com.cn/
  IdentityServer4 英文文档 https://identityserver4.readthedocs.io/en/latest/
  OpenID Connect 官网 https://openid.net/connect/
  OpenID Connect 中文 https://www.cnblogs.com/linianhui/p/openid-connect-core.html
  OpenID Connect和OAuth 2.0对比:https://www.jianshu.com/p/d453076e6433
  Oauth 2.0 官网:https://oauth.net/2/
  Oauth 2.0 授权框架:https://tools.ietf.org/html/rfc6749#section-4.2.1

一、服务端

1、定义客户端

    new Client{         ClientId="mvc client Hybrid", //客户端Id         ClientName="测试客户端 Hybrid", //客户端名称 随便写          ClientSecrets={ new Secret("mvc secret Hybrid".Sha256()) },          AllowedGrantTypes=GrantTypes.Hybrid,//验证模式           // 如果客户端 response_type 包含 token 这里必须启用         //AllowAccessTokensViaBrowser=true,          RedirectUris = { "http://localhost:5003/signin-oidc" },           //注销重定向的url         PostLogoutRedirectUris = { "http://localhost:5003/signout-callback-oidc" },          AllowOfflineAccess=true,         AlwaysIncludeUserClaimsInIdToken=true,                    //客户端访问权限         AllowedScopes =         {             "api1",             IdentityServerConstants.StandardScopes.OpenId,             IdentityServerConstants.StandardScopes.Email,             IdentityServerConstants.StandardScopes.Address,             IdentityServerConstants.StandardScopes.Phone,             IdentityServerConstants.StandardScopes.Profile,             "roles",         }

二、客户端

1、修改StartUp.cs

ConfigureServices()

//关闭了 JWT 身份信息类型映射 //这样就允许 well-known 身份信息(比如,“sub” 和 “idp”)无干扰地流过。 //这个身份信息类型映射的“清理”必须在调用 AddAuthentication()之前完成 //区别可参考下面截图, //简单理解  //jwt 的 key 映射出来是 http://xxxxxxxxxxxxxxx //well-known 映射出来是 sub idp 这样简洁的字符 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); //添加认证信息 services.AddAuthentication(options => {     options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;     options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => {     options.AccessDeniedPath = "/Authorization/NoPermission"; }) .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>  {      //IdentityServer4 服务器地址      options.Authority = "http://localhost:5002";      options.ClientId = "mvc client Hybrid";      options.ClientSecret = "mvc secret Hybrid";      options.RequireHttpsMetadata = false;      options.SaveTokens = true;      options.ResponseType = OidcConstants.ResponseTypes.CodeIdToken;       //如果请求token 就必须再定义客户端的时候设置运行通过浏览器来返回AccessToken      //options.ResponseType = OidcConstants.ResponseTypes.CodeToken;      //options.ResponseType = OidcConstants.ResponseTypes.CodeIdTokenToken;       options.Scope.Clear();      options.Scope.Add("api1");      options.Scope.Add(OidcConstants.StandardScopes.OpenId);      options.Scope.Add(OidcConstants.StandardScopes.Email);      options.Scope.Add(OidcConstants.StandardScopes.Phone);      options.Scope.Add(OidcConstants.StandardScopes.Address);      options.Scope.Add(OidcConstants.StandardScopes.Profile);      options.Scope.Add(OidcConstants.StandardScopes.OfflineAccess);      options.Scope.Add("roles");        //去掉默认过滤的 claim,这样 User.Claims 里就会出现这个 claim      options.ClaimActions.Remove("nbf");       //增加过滤的 claim,这样 User.Claims 里就会删除这个 claim      options.ClaimActions.DeleteClaim("sid");       options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters      {          //映射 User.Name          NameClaimType = JwtClaimTypes.Name,          RoleClaimType = JwtClaimTypes.Role      };  });

Configure()

   app.UseStaticFiles();    //写在 UseMvc() 前面    app.UseAuthentication();    app.UseMvcWithDefaultRoute();

三、API资源

  参考之前的文章《IdentityServer4 (1) 客户端授权模式》

四、测试

1、点击受保护的资源

IdentityServer4 (5) 混合模式(Hybrid)

2、跳转到授权服务器并登陆

IdentityServer4 (5) 混合模式(Hybrid)

3、点击同意,自动跳转回原来的页面

IdentityServer4 (5) 混合模式(Hybrid)

 IdentityServer4 (5) 混合模式(Hybrid)

4、测试访问 api1 资源

  点击上图按钮 测试api1

 IdentityServer4 (5) 混合模式(Hybrid)

赞(0) 打赏
未经允许不得转载:张拓的天空 » IdentityServer4 (5) 混合模式(Hybrid)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

专业的IT技术经验分享 更专业 更方便

联系我们本站主机

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏