AuthenticationManager.SignOut() 无法注销用户的问题

http://hadb.me/2015/03/23/authenticationmanager-signout-not-working/

 

这文章不对, 我发现原因是不能有Response.Redirect("~/");跳转了后,,就退不出登录了

            AuthenticationManager.SignOut();
            //Response.Redirect("~/");

 

 

最近遇到一个很诡异的问题,在最近的一个新项目中,发现在MVC5下,偶尔会出现登陆的用户无法注销的问题,经检查发现AuthenticationManager.SignOut()执行之后并没有删除Cookie,手动删除Cookie之后,该功能又正常了,又能正常登陆、注销了。前面几次出现这个问题我都是手动删除Cookie,发现恢复了之后,我也就没在意。

刚刚又出现这个问题,我怒了,决定Google下。Google了一番之后,发现这个问题还挺普遍,但是都没有什么好的答案。后来看到有人说,用AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie)可以解决这个问题,一试,还真解决了。可是官方的例子里并没有传这个参数,而且我以前的几个站点,都是用的官方例子里的AuthenticationManager.SignOut(),而且都没有出现这个问题。百思不得其解,好挫折。不弄清楚睡不着觉。于是又继续搜,终于发现了一个帖子,https://aspnetidentity.codeplex.com/workitem/2347

当初这个问题应该是发生在Microsoft.AspNet.Identity 2.0/2.1 rc + Microsoft.Owin.3.0 rc版中,我以前项目用的Identity2.2 + Owin 3.0中,应该是没有这个问题。最近刚更新的Identity2.3 + Owin 3.0.1中,又有了这个问题。

哈哈!突然感觉我已经走在MVC的前沿了。记下这个问题,为今后遇到这个问题的朋友们排忧解难!

解决方案就是,在LogOff方法里,用AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie)就行了。

当然,我这个项目并没有用到第三方登陆,如果用到了第三方登陆,可能还需要添加AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);

by HADB @ Home

转载于:https://www.cnblogs.com/shiningrise/p/5653352.html

那我能能在结合oauth2呢,我业务系统也访问了这个api @Configuration @EnableWebSecurity @EnableMethodSecurity public class SecurityConfig { private static final Logger log = LoggerFactory.getLogger(SecurityConfig.class); @Autowired JwtAuthFilter jwtAuthFilter; @Autowired private IDeviceAdminService deviceAdminService; @Autowired JwtUtil jwtUtil; @Autowired ISysUserService sysUserService; @Autowired CustomCorsConfigurationSource configurationSource; //权限足 @Autowired private PerAccessDeniedHandler perAccessDeniedHandler; @Autowired private WxRequestUtil wxRequestUtil; @Autowired private IdempotentValidationFilter idempotentFilter; @Bean public SecurityFilterChain filterChain(HttpSecurity http, AuthenticationManager authenticationManager) throws Exception { // 创建幂等性过滤器实例 http.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); http.csrf(AbstractHttpConfigurer::disable).cors(c -> c.configurationSource(configurationSource)) .authorizeHttpRequests( (authorize) -> authorize .requestMatchers("/api/v1/*/test/**", "/api/v1/sign-in", "/api/v1/xcx-sign-in", "/api/v1/sign-up", "/api/v1/reset-password", "/api/v1/refreshToken", "/api/v1/captcha", "/favicon.ico" , "/api/v1/wx/xcx-openid", "/api/v1/pay/wechat/callback").permitAll() .requestMatchers("/api/v1/**").authenticated() .anyRequest().authenticated() ) .authenticationProvider(authenticationProvider()) // .addFilterBefore(new QrCodeAuthenticationFilter("/sign-in/qrcode"), UsernamePasswordAuthenticationFilter.class) // .addFilterBefore(new WeChatAuthenticationFilter("/sign-in/wechat"), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new XcxAuthenticationFilter("/api/v1/wx/xcx-login", authenticationManager, wxRequestUtil, sysUserService, jwtUtil), UsernamePasswordAuthenticationFilter.class) .addFilterAfter(idempotentFilter, JwtAuthFilter.class); // .addFilterBefore(new TenantFilter(), jwtAuthFilter.getClass()) http.sessionManagement(session -> { session.sessionCreationPolicy(SessionCreationPolicy.STATELESS); }); //权限足 http.exceptionHandling(r -> { r.accessDeniedHandler(perAccessDeniedHandler); }); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); } @Bean public AuthenticationProvider authenticationProvider() { CustomAuthenticationProvider authenticationProvider = new CustomAuthenticationProvider(); authenticationProvider.setUserDetailsService(sysUserService); authenticationProvider.setPasswordEncoder(passwordEncoder()); return authenticationProvider; } //oauth2 // @Bean // JwtDecoder jwtDecoder(String issuer, String audience) { // OAuth2TokenValidator<Jwt> defaults = JwtValidators.createDefaultWithIssuer(issuer); // OAuth2TokenValidator<Jwt> audiences = new JwtClaimValidator<List<String>>(AUD, // (aud) -> aud != null && aud.contains(audience)); // OAuth2TokenValidator<Jwt> all = new DelegatingOAuth2TokenValidator<>(defaults, audiences); // NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withIssuerLocation(issuer).build(); // jwtDecoder.setJwtValidator(all); // return jwtDecoder; // } /** * 自定义方法安全表达式处理器,注册自定义权限检查方法(如 hasDevicePermission) */ @Bean public MethodSecurityExpressionHandler methodSecurityExpressionHandler() { // 创建默认的表达式处理器 DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler(); PermissionEvaluator evaluator = new PermissionEvaluator() { @Override public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { System.out.println("用这种鉴权方法"); return false; } //可以做到按钮级权限控制 @Override public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { if (authentication != null && authentication.getPrincipal() instanceof UserDetails) { SysUser sysUser = (SysUser) authentication.getPrincipal(); if (permission instanceof String permissionStr) { log.info("登陆信息:{}", sysUser);//这个人 log.info("传入的值:{}", targetId);//这个id log.info("权限控制:{}", permissionStr);//有没有这个权限值 // TODO 设备权限管理 if (targetType.equals("iot")) {//设备操作 //先判断是是这个设备的管理员 String userID = sysUser.getId(); List<DeviceAdmin> deviceAdmins = deviceAdminService.getByDeviceId((String) targetId); Stream<DeviceAdmin> deviceAdminStream = deviceAdmins.stream().filter(admin -> admin.getUserId().equals(userID)); if (deviceAdminStream.findAny().isPresent()) { return true; } return true; }else if(targetType.equals("vip")){//会员操作 } } } return false; } }; // 设置自定义的权限评估器(核心:在这里注册我们的设备权限检查逻辑) handler.setPermissionEvaluator(evaluator); return handler; } }
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值