我一直在冒险让JWT在DotNet核心2.0上工作(现在到达最终版本).有大量的文档,但是所有的示例代码似乎都在使用已弃用的API并且刚刚进入Core,它确实令人眼花缭乱地想出它应该如何实现.我尝试使用Jose,但应用程序.不推荐使用UseJwtBearerAuthentication,并且没有关于下一步操作的文档.
有没有人有一个使用dotnet core 2.0的开源项目,它可以简单地从授权头解析JWT并允许我授权HS256编码的JWT令牌?
类下面不抛出任何异常,但没有请求授权,和我没有得到任何指示,为什么他们是未经授权的.响应是空的401,所以对我来说,表明没有异常,但秘密不匹配.
奇怪的是我的令牌是用HS256算法加密的,但是我没有看到任何指示器要求它强制它在任何地方使用该算法.
这是我到目前为止的课程:
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
using Newtonsoft.Json.Linq;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace Site.Authorization
{
public static class SiteAuthorizationExtensions
{
public static IServiceCollection AddSiteAuthorization(this IServiceCollection services)
{
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("SECRET_KEY"));
var tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false, …
Run Code Online (Sandbox Code Playgroud) JOSE、JWA、JWE、JWK、JWS 和 JWT 之间有什么区别?它们之间有何关系?
我试图使用 Jose 库对我的 Flask 应用程序之一进行身份验证。使用 import 语句如下
from jose import jwt
Run Code Online (Sandbox Code Playgroud)
但它抛出以下错误,
Traceback (most recent call last):
File "F:/XXX_XXX/xxxx-services-web/src/auth.py", line 6, in <module>
from jose import jwt
File "F:\Users\XXXX_XXXXX\AppData\Local\Programs\Python\Python37\lib\site-packages\jose.py", line 546
print decrypt(deserialize_compact(jwt), {'k':key},
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
这个库过时了吗?
RFC7518 具有JWT 中使用的算法值列表。EdDSA
然而,诸如 之类的没有任何价值Ed25519
。在 Jose 验证时也不Ed25519
接受作为有效值。正确的 alg 值是多少Ed25519
?
ubuntu 20.x
这是我用来为 JOSE/NODEJS (14.16) 应用程序生成 EdDSA 25519 密钥对的命令:
$ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id-ed25519 -C myemail_address
Run Code Online (Sandbox Code Playgroud)
这是生成的私钥:
-----BEGIN OPENSSH PRIVATE KEY-----
a3BlbnNzaC1rZXktdjEAAAAABG5vbmVAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACAp92w+fwodL4kaUDrNghdZScdcg54IJOO6tLpG91oeKgAAAJj71Y9w+9WP
cAAAAAtzc2gtZWQyNTUxOQAAACAp92w+awodL4kaUDrNghdZScdcg54IJOO6tLpG91oeKg
AAAEDsEfbdyx4HaM5cL1f2Ag2Knb0NDCIiuIDsm6FwR5NJESn3bD5/Ch0viRpQOs2CF1lJ
c1yDnggk47q0ukb3Wh4qAAAAFGVtY2yhYjIwMTFAZ21haWwuY29tAQ==
-----END OPENSSH PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
私钥有 366 字节而不是 32 字节。
这是公钥:
BAAAC3NzaC1lZ1I1NTE5AAAAICn3CD5/Ch0viRpQOs2CF1lJx1yDnggk47q0ukb3Wh4q myemail_address
Run Code Online (Sandbox Code Playgroud)
不包括电子邮件地址的话,它有 63 字节,看起来太长了。
这是为 EdDSA 25519 生成密钥对的正确方法吗?如果不是,正确的方法是什么?
我正在尝试使用简单JOSE
encrypt
和decrypt
函数node-jose
.
我的代码如下(使用Node 8.2.1编写)
const { JWE } = require('node-jose');
const jose = (publicKey, privateKey) => {
async function encrypt(raw) {
if (!raw) throw new Error('Missing raw data.')
const buffer = new Buffer(JSON.stringify(raw));
return JWE.createEncrypt(publicKey).update(buffer).final();
}
async function decrypt(encrypted) {
if (!encrypted) throw new Error('Missing encrypted data.')
const buffer = new Buffer(JSON.stringify(encrypted));
return JWE.createDecrypt(privateKey).decrypt(buffer);
}
return { encrypt, decrypt }
}
module.exports = jose;
Run Code Online (Sandbox Code Playgroud)
我使用生成RSA密钥对generate-rsa-keypair
.
因此,通过此代码进行测试,加密方面的工作正常
const { JWK } = require('node-jose'); …
Run Code Online (Sandbox Code Playgroud) 我是 jwt 的新手,在阅读了大量网页后,我没有找到如何使用从该网站https://mkjwk.org/生成的密钥对生成令牌(签名和加密)的示例。我认为这不会很困难。我认为这是生成签名令牌的方法(我不知道是否正确):
RSACryptoServiceProvider rsaCrypto = new RSACryptoServiceProvider();
var payload = new Dictionary<string, object>()
{
{"jti", "ORIGEN_" + Guid.NewGuid().ToString()},
{"iat", DateTime.UtcNow},
{"exp", DateTime.UtcNow.AddYears(1)},
{"login", "USER" },
{"password", "PASSWORD" },
{"origen", "ORIGEN" }
};
// Contains both public and private keys to sign
var headers = new Dictionary<string, object>()
{
{ "kty", "RSA" },
{ "d", "A7Q8cttv_CSG4CJkX_xlU5lUoeRrCPZpyZx9eVaD7zi-tE7wDPKNmJPRP6uR_LA2YVXMmfY9w8q1_v_MiYxkYnFgZqNZlKdwucSQUlnfX5Tt806qh_323h5NnHrKweL-98_d8R4RuZXCWEQ3X0QDCVfccaLVVqLJy8S5zlx0aAVuBJxLxBHFRO700qdUN-RaMjHULoOnE1KbwmfKPfGlLL0YWPHQ9t-qIBh6OSZsDZh30K4VLF8sRXkGgn81_Byp4hK9tCfG98R6fWUM2_FCQrC9R1hO-KTsLffRzMboWe-2ymZGQfZKO-gtFaQH7_AjdVnQYMyKhSSCGYAAroSZAQ"},
{ "e", "AQAB" },
{ "use", "enc"},
{ "kid", "RPA" },
{ "alg", "RS256" },
{ "n", "qJPwMcHtb7xFGGczn20IiEtrPVehquyT6lxIJa_e4vcZE33uM6myVZWocTZWzTDmrNT3bJghEpLOhrgYatT3QnJIiTM9KAD01kYPc5cP5yo6Wmu0YjivqL3Rj7dUvi2pvl7juwYxt1_8zfdnBN5GpBIYcaY3ulVo_OSL7TOxJrua5IMhilQz6kqta3-Rgz3GSglOs94RHRvorYxMyHPQ6KhwSlh_zLzJQZ-0-AZ4yaMPdVwEaaEJpL-odYmRudX4E0t42dExLf_q1rpRfvTcdFSwfsJ7FmQcOtlc340WUgr4BHJfwrNIE4i-TFqrB4zSQJVKHlBfLeGKiYZQPD7igw" }
};
string …
Run Code Online (Sandbox Code Playgroud) 我不明白为什么存在JWS不受保护的头文件.
对于某些上下文:JWS未受保护的头包含不受完整性保护的参数,并且只能使用带有JSON序列化的每个签名.
如果它们可以用作顶级标题,我可以看到为什么有人想要包含一个可变参数(这不会改变签名).然而,这种情况并非如此.
任何人都可以想到一个用例或知道为什么它们被包含在规范中?
谢谢!
我有智威汤逊作为
var signedJwt = "eyJhbGciOiJFUzI1NiIsImtpZCI6IjZjNTUxNmUxLTkyZGMtNDc5ZS1hOGZmLTVhNTE5OTJlMDAwMSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1OTY3MzA4ODMsInJlcXVlc3RfYm9keV9zaGEyNTYiOiI4NDMyODhkMWMxYmM0NzhlMTBhOTM2NWQ1YjIzY2U5ZWZlY2E2ZjdkYjA3NDQ3Y2JmNjU4YTg3ZjEzZjI1ZjJmIn0.3yQY6gtNq0lQlx6eNLO_3coGqf2VkX2CBRWam9Lz0dcVvr8h4LkYfuZMwQf1fzZ_XXHEV_o17LciyBC-O72UUw"
Run Code Online (Sandbox Code Playgroud)
然后我得到一个公钥:
{
"alg": "ES256",
"created_at": 1560466143,
"crv": "P-256",
"expired_at": null,
"kid": "6c5516e1-92dc-479e-a8ff-5a51992e0001",
"kty": "EC",
"use": "sig",
"x": "35lvC8uz2QrWpQJ3TUH8t9o9DURMp7ydU518RKDl20k",
"y": "I8BuXB2bvxelzJAd7OKhd-ZwjCst05Fx47Mb_0ugros"
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 C# 中的 Jose 库进行解码
var claims = Jose.JWT.Decode(signedJwt, publicKey, JwsAlgorithm.ES256);
Run Code Online (Sandbox Code Playgroud)
每次我收到错误时:
EcdsaUsingSha 算法期望密钥为 CngKey 或 ECDsa 类型。
我认为我使用密钥的方式不正确,但我找不到任何方法将 json 密钥转换为 pem 或任何有效的东西。
我正在努力了解如何使用 npm jose 模块(https://www.npmjs.com/package/jose)在我的 Node 应用程序中创建和验证签名的 JWT 令牌。我的场景是这样的:我想签署经过身份验证的请求来访问资源。我可以成功为此请求授予令牌创建 JWT 声明,该声明尊重 \xe2\x80\x9cits\xe2\x80\x9d 和 \xe2\x80\x9caud\xe2\x80\x9d、\xe2\x80\x9cexp\ 的属性xe2\x80\x9d 等,但我想对其进行签名(即使用 SignJWT 对象和 \xe2\x80\x98sign\xe2\x80\x99 方法),以便当它作为请求我可以验证它并授予或拒绝访问。\n\n\xe2\x80\x9csign\xe2\x80\x9d 方法不\xe2\x80\x99t 似乎喜欢我为 \xe2\x80\x98key\xe2 传递的任何内容\x80\x99 参数(我没有传递任何选项 \xe2\x80\x94 也许我应该传递,但是什么?)。\n我正在尝试使用 RSA 密钥对。我想用私钥签名并用公钥验证。为了满足我的迫切需要,我想我可以使用对称密钥,但我正在考虑其他一些未来场景,在这些场景中我将需要证书密钥的这种经典 PKCS 关系。无论如何,我不\xe2\x80\x99认为这个选择与当前我的进步的障碍有任何关系。\n我首先尝试使用 jose/util/generate_key_pair 创建我的公共/私有对。但是当我去使用密钥时,错误告诉我我的实现不支持这一点。因此,我转而尝试在我的应用程序之外创建 \xe2\x80\x98pem\xe2\x80\x99 证书并应用它(作为文本),但这也失败了。\xe2\x80\x98sign\xe2\x80\x99 方法报告密钥必须是 \xe2\x80\x98KeyLike\xe2\x80\x99、\xe2\x80\x98CryptoKey\xe2\x80\x99 或 \xe2 \x80\x98Uint8Array\xe2\x80\x99 类型。好吧,UInt8Array(节点缓冲区)没有足够的类型信息:它不\xe2\x80\x99t说明该缓冲区中的内容,而\xe2\x80\x9cKeyLike\xe2\x80\x9d是一个如此模糊的定义,它\xe2\x80\x99s 可以忽略。在请求搜索引擎的神谕之后,我发现我可以使用 Node API 中的以下内容创建 CryptoKey 格式的密钥对:
\ncrypto.webcrypto.subtle.generateKey(\n {\n name: \'RSASSA-PKCS1-v1_5\',\n modulusLength: 2048,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: "SHA-256"\n },\n true,\n [\xe2\x80\x98sign\xe2\x80\x99, \xe2\x80\x98verify\xe2\x80\x99]\n).then((pair:any) => {\n serverInstance.keyPair = pair\n})\n
Run Code Online (Sandbox Code Playgroud)\n但是,当我到达签名部分时:\nsiaToken.sign(serverInstance.keyPair.privateKey).then(signature => {
我收到一个异常,报告\n\xe2\x80\x9cTypeError: CryptoKey 不支持此操作\xe2\x80\x9d …
jose ×10
jwt ×7
c# ×3
encryption ×2
jwk ×2
node.js ×2
.net ×1
.net-core ×1
asp.net-core ×1
ed25519 ×1
javascript ×1
jwe ×1
python ×1
rsa ×1
sign ×1