`
wyf
  • 浏览: 435580 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

Cookie认证下验证JWT

 
阅读更多

ASP.NET Core中的cookies 认证不支持传递jwt。需要自定义实现 ISecureDataFormat接口的类。现在,你只是验证token,不是生成它们,只需要实现Unprotect方法,其他的交给System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler这个类处理。

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http.Authentication;
using Microsoft.IdentityModel.Tokens;
 
namespace SimpleTokenProvider
{
    public class CustomJwtDataFormat : ISecureDataFormat<AuthenticationTicket>
    {
        private readonly string algorithm;
        private readonly TokenValidationParameters validationParameters;
 
        public CustomJwtDataFormat(string algorithm, TokenValidationParameters validationParameters)
        {
            this.algorithm = algorithm;
            this.validationParameters = validationParameters;
        }
 
        public AuthenticationTicket Unprotect(string protectedText)
            => Unprotect(protectedText, null);
 
        public AuthenticationTicket Unprotect(string protectedText, string purpose)
        {
            var handler = new JwtSecurityTokenHandler();
            ClaimsPrincipal principal = null;
            SecurityToken validToken = null;
 
            try
            {
                principal = handler.ValidateToken(protectedText, this.validationParameters, out validToken);
 
                var validJwt = validToken as JwtSecurityToken;
 
                if (validJwt == null)
                {
                    throw new ArgumentException("Invalid JWT");
                }
 
                if (!validJwt.Header.Alg.Equals(algorithm, StringComparison.Ordinal))
                {
                    throw new ArgumentException($"Algorithm must be '{algorithm}'");
                }
 
                // Additional custom validation of JWT claims here (if any)
            }
            catch (SecurityTokenValidationException)
            {
                return null;
            }
            catch (ArgumentException)
            {
                return null;
            }
 
            // Validation passed. Return a valid AuthenticationTicket:
            return new AuthenticationTicket(principal, new AuthenticationProperties(), "Cookie");
        }
 
        // This ISecureDataFormat implementation is decode-only
        public string Protect(AuthenticationTicket data)
        {
            throw new NotImplementedException();
        }
 
        public string Protect(AuthenticationTicket data, string purpose)
        {
            throw new NotImplementedException();
        }
    }
}

 在startup.cs中调用

var tokenValidationParameters = new TokenValidationParameters
{
    // The signing key must match!
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = signingKey,
 
    // Validate the JWT Issuer (iss) claim
    ValidateIssuer = true,
    ValidIssuer = "ExampleIssuer",
 
    // Validate the JWT Audience (aud) claim
    ValidateAudience = true,
    ValidAudience = "ExampleAudience",
 
    // Validate the token expiry
    ValidateLifetime = true,
 
    // If you want to allow a certain amount of clock drift, set that here:
    ClockSkew = TimeSpan.Zero
};
 
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    AuthenticationScheme = "Cookie",
    CookieName = "access_token",
    TicketDataFormat = new CustomJwtDataFormat(
        SecurityAlgorithms.HmacSha256,
        tokenValidationParameters)
});

 如果请求中包含名为access_token的cookie验证为合法的JWT,这个请求就能返回正确的结果,如果需要,你可以加上额外的jwt chaims,或者复制jwt chaims到ClaimsPrincipal在CustomJwtDataFormat.Unprotect方法中,上面是验证token,下面将在asp.net core中生成token。

https://www.cnblogs.com/indexlang/p/indexlang.html

分享到:
评论

相关推荐

    cookie中的JWT身份验证

    1. **配置Cookie**: 在`ConfigureServices`方法中,我们需要配置Cookie认证中间件,包括Cookie的名称、过期时间等。 2. **处理Cookie**: 当收到带有JWT的Cookie时,中间件会自动解码并验证JWT。 **四、PostgreSQL+...

    .net core 3.1 WepApi 前后分离身份验证及webapi调试demo ,jwt+swagger

    .netcore3.1添加swagger及JWT Authorize 验证 JWT 的优缺点 相比于传统的 cookie-session 认证机制,优点有: 更适用分布式和水平扩展 在cookie-session方案中,cookie内仅包含一个session标识符,而诸如用户...

    ASP.NET Core 中使用 JWT 实现令牌认证及授权范例程序代码

    ASP.NET Core 是微软推出的跨平台、高性能的开源...理解如何配置JWT认证中间件、生成和验证JWT,以及使用授权特性是开发安全Web应用的关键步骤。通过LoginDemo项目,你可以更深入地了解这些概念在实际项目中的应用。

    身份验证包 支持Header、Cookie、Param等多种传参方式 包含:验证、验证并且自动刷新等多种中间件

    本文将深入探讨一个专为Web应用开发设计的身份验证包,它支持Header、Cookie、Param等多种传参方式,并提供了验证以及验证后自动刷新等多种中间件功能。这个身份验证包尤其适用于OAuth、单点登录(Single Sign-On, ...

    JWT相关知识及Cookie, Session,Token和JWT的区别总结.pdf

    3. **Signature**:Signature用于验证JWT的完整性和来源。它由Header和Payload的Base64编码字符串加上一个秘钥通过签名算法计算得出。接收方可以通过这个签名验证JWT的完整性和发件人的身份。 JWT的优缺点如下: -...

    第八章 SpringCloud Oauth2认证中心-基于JWT认证.pdf

    本章内容主要围绕如何构建一个使用JWT(JSON Web Token)的Oauth2认证中心展开,旨在提供一种高效、无状态且可分布式处理的身份验证方案。 JWT是一种轻量级的身份认证和授权标准,适用于Web应用。它由三部分组成:...

    JWT认证原理、流程整合springboot实战应用

    2. 实现JWTUtil工具类,包含生成和验证JWT的方法。 3. 编写登录接口,验证用户后调用JWTUtil生成Token。 4. 创建过滤器,注入JWTUtil,解析请求中的Token并验证。 5. 在受保护的控制器方法上添加`@Secured`或`@...

    JWT类,可用于接口的安全验证问题

    3. **Signature**:用于验证JWT的完整性和来源,防止篡改。它是由Header、Payload以及一个预先设定的密钥(Secret)通过指定的哈希算法(如HMAC SHA256)计算得出的。 在PHP中,我们可以使用如`firebase/php-jwt`...

    spring-security cookie认证

    在这个“spring-security cookie认证”主题中,我们将深入探讨如何利用Spring Security来处理基于Cookie的身份验证。 Cookie是Web应用中常用的客户端存储机制,用于在用户与服务器之间传递信息,例如用户会话ID。...

    Webapi_JWT_Authentication-master_webapi_jwt_token_

    具体实现可能包括使用特定的库,如`System.IdentityModel.Tokens.Jwt`,用于生成和验证JWT,以及配置WebAPI的路由和过滤器,以检查每个请求的JWT。 该项目的源码分析可以帮助我们理解JWT认证的工作原理,同时也可以...

    JWTDemo.zip

    2. **创建JWT**:JWT由三部分组成,头部通常包含算法类型(如HS256或RS256),负载则包含声明(如用户ID、角色等),签名是前两部分通过指定算法加密的结果,用于验证JWT的完整性和来源。 3. **发送JWT**:服务器将...

    jwt简单的介绍和了解

    3. **签名(Signature)**:将头部和载荷使用Base64URL编码后,与一个密钥(secret)结合,通过指定的签名算法(如HS256)计算得出,用于验证JWT的完整性和来源。 ### JWT的优势 1. **无状态**:与基于Session的...

    Golang中使用 JWT认证来 保障Restful JSON API的安全(英文) - 推酷

    2. **验证JWT**:当客户端发送带有JWT的请求时,服务器需要验证该令牌的有效性。这通常涉及到解析JWT并验证其签名是否正确,以及检查JWT中的声明是否仍然有效(例如,令牌是否已过期)。 3. **处理请求**:一旦JWT被...

    JWTTest_netty.netcore_jwt_

    头部和负载通常被Base64编码,而签名则用于验证JWT的完整性和来源。 1. **Netty**:这是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在JWTTest项目中,Netty可能...

    php简单的cookie身份验证机制

    - OAuth、JWT(JSON Web Tokens)等现代认证机制提供了更高级别的安全性和灵活性。 了解这些基础知识后,你可以根据提供的源代码学习和理解实际的实现细节,并可能进一步优化和增强这个简单的Cookie身份验证机制。

    jwt-decode.js

    头部和负载都是JSON对象,它们被Base64URL编码,而签名则是通过将编码后的头部、负载与一个密钥(secret)进行哈希运算生成的,用于验证JWT的完整性和来源。 1. **JWT工作原理**: - **Header**: 包含了JWT的类型...

    JWT实现的单点登录系统Demo

    之后,用户访问其他系统时,只需要携带这个JWT,各个系统通过验证JWT的签名来确认用户身份,无需再次登录。 ### Java实现JWT SSO 1. **依赖库**:使用如`jjwt`之类的Java库来生成和解析JWT。`jjwt`库提供了一套...

    SpringSecurity之JWT实现token认证和授权.zip

    它通过在客户端和服务器之间传递令牌来验证用户身份,而不是传统的session和cookie方式。JWT包含三部分:头部、载荷和签名,其中载荷可以携带用户信息,而签名则确保数据的完整性和来源的可靠性。 要将Spring ...

    jwt 需要的jar ,只有jar

    4. **验证JWT**:服务器接收到JWT后,使用公钥(如果JWT由密钥对生成)或预先共享的密钥进行解码和验证签名,确认JWT未被篡改且未过期,然后根据载荷中的信息进行授权。 JWT的特性包括: 1. **无状态**:JWT自身...

    JWT认证.pdf

    签名是前两部分(Base64编码后的头部和载荷)与服务端的私钥一起经过算法处理的结果,用于验证JWT的完整性和来源。 4. **时效性**: JWT通常有一个有效期,例如在本例中为1小时。这意味着在指定时间内,用户无需...

Global site tag (gtag.js) - Google Analytics