是否存在JWT的Scala实现或者至少是Play的一个示例?发布此问题后,我在互联网上进一步搜索并找到了JWT的一些介绍.任何建议都会非常感激.
我试图JWT在ASP.NET Core Web API项目中使用身份验证机制.假设此项目没有MVC部分,并且不使用cookie身份验证.我已根据本指南创建了我的代码.
登录工作好,保护与[Authorize]属性工作正常,但User.Identity.Name就是null.我怎样才能解决这个问题?
我的代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],
ValidateAudience = true,
ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],
ValidateIssuerSigningKey = true,
IssuerSigningKey = _signingKey,
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters,
AuthenticationScheme …Run Code Online (Sandbox Code Playgroud) 由于我想使用 React Context 设置 Axios 拦截器,因此似乎可行的唯一解决方案是创建一个拦截器组件,以便使用 useContext 挂钩来访问 Context 状态和分派。
问题是,这会创建一个闭包,并在调用拦截器时将旧数据返回给拦截器。
我正在使用 React/Node 使用 JWT 身份验证,并且我正在使用 Context API 存储访问令牌。
这就是我的拦截器组件现在的样子:
import React, { useEffect, useContext } from 'react';
import { Context } from '../../components/Store/Store';
import { useHistory } from 'react-router-dom';
import axios from 'axios';
const ax = axios.create();
const Interceptor = ({ children }) => {
const [store, dispatch] = useContext(Context);
const history = useHistory();
const getRefreshToken = async () => {
try {
if (!store.user.token) {
dispatch({
type: 'setMain', …Run Code Online (Sandbox Code Playgroud) 我需要存储 JWT 令牌,该令牌是在有效用户通过 REST API 正确注册后登录时生成的。我阅读并找到了在客户端站点存储 JWT 的这些方法:本地存储、会话存储、cookie、HttpOnly cookie、浏览器内存(React 状态)。
需要建议以正确的方法存储 JWT,并且还可以访问某些 API 以使用 JWT 令牌作为 post 请求标头参数用户相关数据进行获取。
这是我的登录代码部分,此时我将 JWT 令牌存储到窗口对象,之前保存在本地存储上,但现在需要以除本地存储或 cookie 之外的其他方式安全存储。
const handleSubmitLogin = evt => {
evt.preventDefault();
var cart = new Cart();
var request = new NFRequest();
var response = request.api(HTTP_METHOD.POST, '/auth', {
'email_address': allValuesLogin.email_login,
'password': allValuesLogin.password_login,
'cart_list': cart.getCartPostData(),
});
response.then((res) => {
if (res.type === 'success') {
window.$token = res.data.token
setLoginSuccess('Successfully Login')
setTimeout(()=> {
setLoginSuccess('');
}, 3000)
cart.handle({ action_type: "RESET_ITEMS" });
Router.push('/account')
} else {
setLoginError('Wrong …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关 JWKS 的信息,并找到有关密钥轮换概念的信息 - https://developer.okta.com/docs/concepts/key-rotation/
假设我在应用程序中使用 JWKS,但我不会定期获取它们,因此只是硬编码。单键 JSON 对象看起来像
{
"kty": "RSA",
"e": "xxx",
"use": "sig",
"kid": "xxx",
"x5t": "xx",
"x5c": [
"xxx"
],
"n": "xxx
}
Run Code Online (Sandbox Code Playgroud)
JWKS 为您提供公钥,以便您可以验证 JWT。现在提问。
请考虑上面的示例,因此我在应用程序中有密钥,并且想知道何时应该更换它们。
当然,我知道这是不好的做法(我应该直接从 JWKS 端点获取密钥并感到安全),但这只是一个示例(如果这是一个愚蠢的示例,请提出一个更好的示例来描述上下文)。
我已经对围绕这个的"最佳实践"进行了大量的研究,并在博客文章之后阅读了博客文章,在SO问题之后阅读了SO问题,在OWASP文章之后阅读了OWASP文章.我已经得到了一些明确的答案,但有些未知数.
首先,"做":
现在我开始假设拥有一个SPA(使用Angular构建)并使用HTML5 sessionStorage对于短期令牌来说足够安全,但有一点需要说明XSS攻击可能来自一个源自"坏角色"的"坏角色"从CDN加载的许多库之一.
对于我的特定用例,我不计划使用长期令牌 - 在不使用10分钟后过期但我仍然想知道我是否要通过会话跟踪到期或使用刷新令牌 - StormPath推荐前者(不再是无国籍?)但我相信使用JWT的大玩家使用刷新令牌(谷歌使用它们但声明你需要将它们存储在安全的长期存储中,这意味着HTML5 localStorage再次出现问题).
我想这样做,这样我的用户如果刷新页面就不必重新登录(因此需要在客户端存储令牌).我还希望在Cordova的帮助下将我的SPA用作"移动应用程序".这里显而易见的缺陷是,如果我使用cookie,Cordova没有带烘焙的cookie支持/存储,我应该转而使用HTML5本地存储.因为在移动设备上我并不需要担心刷新页面,所以我可以让我的令牌存在于内存中并使用我所确定的策略到期.
如果我采用这种方法,桌面上基于cookie的JWT,移动设备上的"Bearer"标头,我现在需要一个认证端点,它将以两种不同的方式给予令牌,当我在REST API端授权时,我需要支持基于cookie的JWT(带有CSRF)和基于头的JWT验证.这种复杂情况令我担心,因为我不知道我是否能准确预见到这里的安全隐患.
总结一下上面的一系列想法:
我有什么理由不想采取这种方法吗?我假设如果我在我的SPA上使用XSS是一个严重的风险,那么我需要一个经典的登录页面进行身份验证以设置正确的cookie,因为如果我通过SPA进行身份验证,那么任何XSS攻击都可能会拦截它(两者都有)在手机和桌面上)!但是,在移动设备上,我需要将JWT注入到SPA中,可能通过一些自定义DOM元素(元标记?),但此时我可以让SPA执行登录,而不是将XSS视为移动设备上的威胁.Cordova将所有资产打包到安装包中,这样有点好,但为什么不在桌面版上采用相同的方法呢?
我的应用程序只需很少的用户输入,它主要是一个仪表板/报告工具.将有一个"消息中心",但它的内容应始终由用户创建(仅由该用户创建)并进行消毒.在我的用例中,是否可以偏离"最佳实践"并依赖localStorage不计算XSS作为我的SPA的严重风险?这将简化整个过程(按原计划使用HTML5 sessionStorage)并降低复杂性,这将减少潜在安全性失误的攻击面.我只想确保在继续前进之前了解风险.
除了通过构建移动本机应用程序而不使用Cordova将我的SPA转换为移动应用程序之外,还有其他安全方法可以使其安全吗?我讨厌这种情况,但它可能很好.
我很感激所有关于此事的想法!
我正在尝试使用JWT来验证ASP.NET Web API的Node应用程序.
在ASP.NET中,我使用的是.NET 4.5.1和nuget包System.IdentityModel.Tokens.Jwt5.0.0
我不明白的是,为什么命名空间在Microsoft和之间混合System.
例如:
var tokenReader = new JwtSecurityTokenHandler();
tokenReader.ValidateToken(token,
new TokenValidationParameters()
{
ValidateAudience = false
},
out validatedToken);
Run Code Online (Sandbox Code Playgroud)
主要JwtSecurityTokenHandler在System.IdentityModel.Tokens.Jwt命名空间中,但TokenValidationParameters类及其依赖项位于Microsoft.IdentityModel.Tokens命名空间中,并且可能与System.IdentityModel.Tokens命名空间中的类似类冲突.
这是设计还是这可能是其他地方版本不匹配的标志?
(编辑 - 找到正确的解决方案!见下文)
好的 - 这是我第一次尝试使用.Net Core 2.0和身份验证,虽然我过去曾使用过Web API 2.0,并且在过去几年中对各种MVC和Webforms ASP项目进行了相当广泛的工作.
我正在尝试使用.Net Core创建一个仅限Web API的项目.这将形成多租户应用程序的后端以生成一些报告,因此我需要能够对用户进行身份验证.通常的方法是使用JWT - 首先验证用户生成令牌,然后将其传递给客户端以在每个API请求上使用.将使用EF Core存储和检索数据.
我按照这篇文章找到了这个设置的基本方法,我设法让它工作正常 - 我有一个接受用户名/密码的控制器并返回一个令牌(如果有效),并且一些授权策略设置基于索赔.
我需要的下一件事是实际管理用户/密码/等.我以为我只是使用.Net核心身份,因为我会有很多现成的代码来担心用户/角色,密码等.我使用的是自定义User类和UserRole派生自标准IdentityUser和IdentityRole类的类,但我现在已经恢复到标准的那个.
我遇到的问题是我无法弄清楚如何添加身份并注册所有各种服务(rolemanager,usermanager等)而不会破坏身份验证 - 基本上只要我将此行添加到我的Startup.ConfigureServices类中:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<MyContext>();
Run Code Online (Sandbox Code Playgroud)
这一切都出错了,当我收到请求时,我再也看不到任何索赔,所以所有的政策都锁定了,你无法得到任何东西.
如果我没有那些行,那么我最终会遇到与UserManager,RoleManager,UserStore等相关的错误.所有这些都没有注册DI.
那么......如何(如果可能的话)我可以注册身份并正确地将其连接到上下文,但是避免/删除对实际授权机制的任何更改?
我已经在网上看了很多,但是自从.Net Core 1.x以来已经发生了很多变化,所以很多教程等都不再有效了.
我不打算让这个API应用程序拥有任何前端代码,因此我现在不需要对表单或任何内容进行任何cookie身份验证.
编辑
确定,我现在发现在此代码中设置Startup.ConfigureServices()方法中的JWT身份验证:
services.AddAuthentication(
JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
>>breakpoint>>> options.TokenValidationParameters =
new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "Blah.Blah.Bearer",
ValidAudience = "Blah.Blah.Bearer",
IssuerSigningKey …Run Code Online (Sandbox Code Playgroud) 当 Amazon Cognito 发布访问令牌时,它不包含aud字段。
在Cognito 令牌的文档中,该aud字段针对 id 令牌(始终设置为与 相同的值client_id)列出,但没有针对访问令牌列出。
如果处理该声明的委托人在此声明存在时未使用“aud”声明中的值标识自己,则必须拒绝 JWT。
那么,这里发生了什么。谁是对的?这是安全问题吗?
我注意到iss令牌的部分特定于我的用户池,并且不能被篡改,因为它是由亚马逊签名的,所以我认为我应该是安全的
虽然 OAuth 2 和 JWT 非常混乱,所以我想得到更多的意见。
I a have a very simple app with one JWT authenticated controller:
[ApiController]
[Authorize]
[Route("[controller]")]
public class JwtController : ControllerBase
{
public JwtController() { }
[HttpGet]
public ActionResult Get() => Ok("Working!");
}
Run Code Online (Sandbox Code Playgroud)
With the authentication configured as:
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false
};
});
Run Code Online (Sandbox Code Playgroud)
During tests, i want the user to be "authenticated" all the …