记录一次C#使用JWT单点登录

好久没更新了,最近确实比较忙,现在弄完后,第一时间来记录一下最近学到的一些东西

JWT单点登录

一、简单介绍

  1. JWT全称是JSON Web Token,是一种是目前最流行的跨域身份验证解决方案。为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,该token也可直接被用于认证,也可被加密,单点登录的含义这里就不具体介绍了

  2. JWT实际上一个字符串由三部分组成头部(Header)、载荷(Payload)与签名(signature)

二、具体使用

1.下载jwt工具包

我这里就以一个新的mvc项目来演示,创好项目后,在nuget包管理器中,下载jwt,不要下错了哈

等待安装完成

 

2.方法使用

2.1.生成jwt_token

导入这些命名空间,然后进行生成操作

        public string GetJWT_Token() 
        {
            var payload = new Dictionary<string, object>
            {
                { "claim1", 0 },
                { "claim2", "claim2-value" }
            };
            const string secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";

            IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); // symmetric
            IJsonSerializer serializer = new JsonNetSerializer();
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

            var token = encoder.Encode(payload, secret);
            return token;
        }

这里简单测试一下用postman或者浏览器直接访问都可以,我这里就直接浏览器测试了,生成成功后会得到一串字符串

可以看到这个字符串是由三部分组成的,这样就得到一个jwttoken,然后访问别人的网站时候带上这串字符串,他就会同样的jwt方法去解析出你字符串附带的用户信息之类的

这里把解析的方法也提供一下

public string DecodingToken(string Token) 
        {
            string token = Token;
//这里密钥同上,需要两边密钥同步才能解出来
            const string secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";

            try
            {
                IJsonSerializer serializer = new JsonNetSerializer();
                var provider = new UtcDateTimeProvider();
                IJwtValidator validator = new JwtValidator(serializer, provider);
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); // symmetric
                IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);

                var json = decoder.Decode(token, secret, verify: true);
                return json;
            }
            catch (TokenExpiredException ex)
            {
                return ex.Message;
            }
            catch (SignatureVerificationException ex)
            {
                return ex.Message;
            }
        }

把上面获得的token代入进去,就可以解析出值了

后面怎么操作这些值就根据自己的业务逻辑来处理了


后面有时间在更新一篇rabbitmq的操作,今年应该就这样了,工作第一年,学习的东西还是不够多还需继续努力哈哈

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基本的Java代码实现JWT单点登录的示例: 1. 添加依赖 在 Maven 项目中添加以下依赖: ``` <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 2. 生成 JWT Token ``` import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtils { private static final String SECRET_KEY = "YOUR_SECRET_KEY"; private static final long EXPIRATION_TIME = 86400000; // 24小时 public static String generateToken(String username) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } // 验证 Token 是否有效 public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch(Exception ex) { return false; } } // 从 Token 中获取用户名 public static String getUsernameFromToken(String token) { return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject(); } } ``` 3. 验证 JWT Token 在需要验证用户身份的地方,可以使用以下代码验证 JWT Token: ``` import javax.servlet.http.HttpServletRequest; import org.springframework.web.filter.OncePerRequestFilter; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Claims; import io.jsonwebtoken.SignatureException; public class JwtAuthenticationFilter extends OncePerRequestFilter { private static final String SECRET_KEY = "YOUR_SECRET_KEY"; private static final String TOKEN_PREFIX = "Bearer"; private static final String HEADER_STRING = "Authorization"; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String header = request.getHeader(HEADER_STRING); if(header == null || !header.startsWith(TOKEN_PREFIX)) { chain.doFilter(request, response); return; } String token = header.replace(TOKEN_PREFIX, "").trim(); try { Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); request.setAttribute("username", claims.getSubject()); } catch(SignatureException ex) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } chain.doFilter(request, response); } } ``` 4. 配置 Spring Security 在 Spring Security 配置类中添加以下配置: ``` import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN"); } @Override @Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` 以上就是一个基本的Java代码实现JWT单点登录的示例。需要注意的是,SECRET_KEY 应该是一个随机的字符串,不要泄露给其他人。此外,在实际应用中,应该使用数据库或其他存储来保存用户信息,而不是在配置文件中硬编码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值