`
wyf
  • 浏览: 426251 次
  • 性别: 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

分享到:
评论

相关推荐

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

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

    springboot-springsecurity-jwt-demo

    传统的方法是在认证通过后,创建sesstion,并给客户端返回cookie。 现在我们采用JWT来处理用户名密码的认证。区别在于,认证通过后,服务器生成一个token,将token返回给客户端,客户端以后的所有请求都需要在http头...

    go-sso:基于Golang实现的单点登录系统(go-sso),实现手机号注册,手机号+验证码登录,手机号+密码登录,账号登出等功能,用户认证采用cookie和jwt两种方式

    这是一个基于Go语言开发的单点登录系统,实现手机号注册,手机号+验证码登录,手机号+密码登录,账号登出等功能,用户认证采用cookie和jwt两种方式。方法已提供,仅需根据短信通道提供商提供的接口做相应的参数配置...

    ASP.NET Core使用JWT认证授权的方法

    token 存储身份验证所有信息 , 服务端不需要保存用户身份验证信息, 减少服务端压力 , 服务端更容易水平扩展, 由于无状态, 又会导致它最大缺点 , 很难注销 2、 支持跨域访问 Cookie是不允许垮域访问的,token支持 3、...

    Angular之jwt令牌身份验证的实现

    Angular之jwt令牌身份验证 demo https://gitee.com/powersky/jwt 介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于...

    warden-jwt_auth:使用Warden进行JWT令牌认证

    warden-jwt_auth是它使用扩展令牌进行用户认证。 它遵循原则。 当无法使用Cookie时,此gem只是它们的替代品。 作为cookie,以warden-jwt_auth过期的令牌将强制具有到期时间。 如果您需要用户永不注销,那么使用...

    devise-jwt:具有devise和rails的JWT令牌认证

    devise-jwt是一个扩展,它使用令牌进行用户身份验证。 它遵循原则。 当无法使用Cookie时,此gem只是它们的替代品。 作为cookie,以devise-jwt过期的令牌将强制具有过期时间。 如果您需要用户永不注销,那么使用...

    djangOauth:基于ldap与jwt的统一认证系统(sso)

    第三方应用解析jwt token验证有效性,并保存至cookie,每页刷新页面验证一次。 如若令牌过期,则发起(/ api / token-refresh /)令牌刷新接口,获取新的令牌。 当启用LDAP验证方式时,将会自动在数据库创建对应用户...

    nextjs-jwt-authentication:用于演示 Next.js 应用程序与 JWT 身份验证的概念验证应用程序

    Next.js JWT 认证用于演示 Next.js 应用程序与 JWT 身份验证的概念验证应用程序。 该应用程序是在渲染服务器和 API 服务器解耦的假设下制作的。 它使用进行身份验证。主意: 服务器端渲染的应用程序很棒。 它们在...

    详解Go-JWT-RESTful身份认证教程

    1.什么是JWT JWT(JSON Web Token)是一个非常轻巧的规范,这...它将用户信息加密到token里,服务器不保存任何用户信息,服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证, 2.JWT构成 一个JWT由三部分组成,H

    php 后端实现JWT认证方法示例

    基于token的身份验证可以替代传统的cookie+session身份验证方法。 它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名...

    golang之JWT实现的示例代码

    什么是JSON Web Token? JSON Web Token(JWT)是一个开放标准(RFC ...众所周知,在jwt出现之前,我们已经有session、cookie来解决用户登录等认证问题,为什么还要jwt呢? 这里我们先了解一下session,cookie。 sessi

    node-mini-auth:使用带有Express,Mongo的Cookie的JWT身份验证示例

    迷你认证节点 使用带有express,mongo的cookie的JWT auth示例。

    Vue路由之JWT身份认证的实现方法

    一、JWT身份认证简介 JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案,相较于session机制,服务器就不需要保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。JWT 实际上是...

    FastAPI 框架精讲

    FastAPI 的安全、认证和授权,OAuth2 认证和 JWT 认证的实现8. FastAPI 的数据库配置与 SQLAlchemy ORM 的使用9. 大型工程应该如何目录结构设计,多应用的文件拆分10. FastAPI 的中间件开发11. FastAPI 中跨域资源...

    php JWT在web端中的使用方法教程

    基于token的身份验证可以替代传统的cookie+session身份验证方法。三个部分分别如下: header.payload.signature header部分组成 header 格式为: { "typ":"JWT", "alg":"HS256" } 这就是一个json串,两个字段都...

    auth-server:一个非常简单的独立身份验证服务器 Express 应用程序。 设计用于 NGINX 子请求认证

    身份验证服务器设置包含 JWT 的 httpOnly cookie。 每次用户访问保护区时,JWT 都会更新新的到期时间。 如何使用 参考我博客上的这个教程: 配置.env AUTH_PORT - 应用程序的监听端口(默认值:3000) AUTH_...

    vuejwtauth:Vue.js(和Quasar)应用程序的客户端JWT身份验证包

    和JSON Web令牌认证 这是针对和应用程序的客户端身份验证包。 这不是服务器端解决方案。 如果您需要服务器端JWT身份验证,请查看我们的Laravel服务器端软件包。 -即将推出 特征 登录功能。 记住我的功能。 使用...

    JwtUtils.java

    客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。 此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header ...

    jwt-api-server:使用节点5,Express和Waterline的参考JWT认证的API服务器

    简单的JWT API 经过JWT身份验证的基线API服务器。 这旨在作为一个起点/参考,说明如何使用JWT作为经过身份验证的请求的机制/传输来设计API服务器。 包含一个占位符“资源”模型,以演示您可能希望如何包含一些数据以...

Global site tag (gtag.js) - Google Analytics