zoukankan      html  css  js  c++  java
  • 一步一步学习IdentityServer4 (6) Connect-OpenId Cookies SignIn SignOut 那些事

    先来看下下面的配置:

       JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
                services.AddAuthentication(
                    options =>
                    {
                        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                        options.DefaultChallengeScheme = "oidc";
                    }
                    )
                .AddCookie(options=> {
    
                    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
                    options.Cookie.Name = "lym.Cookies";
    
                })  //监控浏览器Cookies不难发现有这样一个 .AspNetCore.lym.Cookies 记录了加密的授权信息 
                .AddOpenIdConnect("oidc", options =>
                {
                    options.Authority = customUrl;
                    options.ClientId = "lym.clienttest";
                    options.ClientSecret = "lym.clienttest";
                    options.RequireHttpsMetadata = false;
                    options.SaveTokens = true;
                    options.ResponseType = "code id_token";
                    //布尔值来设置处理程序是否应该转到用户信息端点检索。额外索赔或不在id_token创建一个身份收到令牌端点。默认为“false”
                    options.GetClaimsFromUserInfoEndpoint = true;
                    options.Scope.Add("openid");
                    options.Scope.Add("profile");
                    options.Scope.Add("cloudservices");
    
                });
    idroptions.Authentication = new IdentityServer4.Configuration.AuthenticationOptions
                       {
                           //监控浏览器cookie不难发现lym.Cookies=8660972474e55224ff37f7421c79a530 实际是cookie记录服务器session的名称
                           CheckSessionCookieName = "lym.SessionId", // CookieAuthenticationDefaults.AuthenticationScheme,//用于检查会话端点的cookie的名称
                           CookieLifetime = new TimeSpan(1, 0, 0),//身份验证Cookie生存期(仅在使用IdentityServer提供的Cookie处理程序时有效)
                           CookieSlidingExpiration = true,//指定cookie是否应该滑动(仅在使用IdentityServer提供的cookie处理程序时有效)
                           RequireAuthenticatedUserForSignOutMessage = true //指示是否必须对用户进行身份验证才能接受参数以结束会话端点。默认为false
                       };
    CheckSessionCookieName 是客户端保留的SessionId,当我们登录后记录到浏览器中

    而 AddAuthentication 中的设置 用作所有其他默认值的回退默认方案,就是在我们退出的时候会根据这个key去Signout

    下来来看退出

     HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
                HttpContext.SignOutAsync("oidc");

    官方说明中这个值可以改变

    修改方式:

    services.AddAuthentication(
                    options =>
                    {
                        options.DefaultScheme = "lym.oauth.cookies";
                        options.DefaultChallengeScheme = "oidc";
                    }
                    )
                .AddCookie("lym.oauth.cookies", options=> {
    
                    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
                    options.Cookie.Name = "lym.idrserver";
    
                })

    在下种可以看到 我有 lym.Cookies 和  lym.WebSite 两个cookies,其实这是我的两个站点cookies  这是个SSO

    值得注意的是这里两个站点的cookies设置

     .AddCookie(options =>
                {
    
                    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
                    options.Cookie.Name = "lym.website";
    
                }) 
    站点1
     .AddCookie(options=> {
    
                    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
                    options.Cookie.Name = "lym.Cookies";
    
                }) 
    站点2

    这里cookies不能设置成一样的key,如果设置一样的会导致覆盖问题,存在一个站点A覆盖站点B的值 导致登录一个站点A后 反问B 又需要重新登录的情况,因为2个站点用的不同的客户端,授权转向的资源地址不同,所以ValidatorAuthorization的是没有授权的,然后转到登录

    接下来就是退出的SignOut的问题了,这里可以注意到 登录状态是由cookies保留,退出站点A的时候肯定不能清除站点B下的cookies,其实在IdentityServer3中给我们提供了一个logoutcallback这样一个地址用户清楚其他站点的cookies或者session, identityserver4中一样的,需要注意的是使用Post方式请求,防止陪恶意Get请求,下面是IdentityServer3中的处理方式

    [AllowAnonymous]
            public void LogOutCallBack(string sid)
            {
            
                var cp = User as ClaimsPrincipal;
                var claimsid = cp.FindFirst("sid");
                if (claimsid != null && claimsid.Value == sid)
                {
                    HttpContext.GetOwinContext().Authentication.SignOut("Cookies");
                }
    
    
            }
    LogOut

    在identiyserver3中调用SignOut后服务器端会根据client客户端列表去请求回调地址清楚cookies

    但是Identityserver4中怎么处理呢?官方demo好像是退出了就直接到logedOut页面,然而貌似没有,连转到的ClientPostLogoutRedirectUris貌似都没用了,所以还是自己跳吧,只需要处理清除其他站点的cookies就行了,保证统一退出

    
    
  • 相关阅读:
    第19章 网络通信----网络程序设计基础
    第18章 多线程----线程同步
    第18章 多线程----线程的优先级
    一款基于jquery和css3的响应式二级导航菜单
    一款纯css3实现的颜色渐变按钮
    一款基于jquery的手风琴显示详情
    推荐10款纯css3实现的实用按钮
    一款纯css3实现的数字统计游戏
    一款基于jquery ui的动画提交表单
    一款纯css实现的漂亮导航
  • 原文地址:https://www.cnblogs.com/liyouming/p/8079378.html
Copyright © 2011-2022 走看看