Authentication 正在发送用户Id和访问令牌
我正在我的ASP.NET Core 2.1应用程序中使用React前端实现Auth0 一旦用户进行身份验证,我将获得一个Authentication 正在发送用户Id和访问令牌,authentication,asp.net-core,jwt,auth0,Authentication,Asp.net Core,Jwt,Auth0,我正在我的ASP.NET Core 2.1应用程序中使用React前端实现Auth0 一旦用户进行身份验证,我将获得一个access\u令牌和一个id\u令牌。我很清楚,access\u token的目的是授予对我的API方法的访问权。我还了解,id\u令牌提供了我可以在前端应用程序中使用的用户数据 问题/担忧是关于在我进行API调用时向后端发送用户数据,例如userId。除了在我的POST请求的主体中包含userId之外,还有其他方法将其发送到我的API方法吗 在Auth0之前,我使用了一些其
access\u令牌
和一个id\u令牌
。我很清楚,access\u token
的目的是授予对我的API方法的访问权。我还了解,id\u令牌
提供了我可以在前端应用程序中使用的用户数据
问题/担忧是关于在我进行API调用时向后端发送用户数据,例如userId
。除了在我的POST
请求的主体中包含userId
之外,还有其他方法将其发送到我的API方法吗
在Auth0之前,我使用了一些其他的解决方案,我从他们那里收到的JWT令牌总是包括userId
,username
,等等。我认为这是一种更安全的方法,因为即使可以看到JWT令牌中的内容,签名使我们能够确保数据没有被篡改
尽管我的API调用是通过SSL
进行保护的,但我觉得在我的请求正文中包含进行API调用的人的用户ID
比通过JWT令牌发送它更不安全
我是否在这里遗漏了什么,或者我们确实在API调用中通过常规方式发送了用户ID
,即在POST
调用的主体中或GET
调用的查询字符串中?问得好,上周我遇到了同样的问题,最后用同样的JWTAccessToken
解决了这个问题
问题在于,在生成可在服务器中检索的访问令牌时,将经过身份验证的用户的UserId添加为声明
添加访问令牌的声明
首先将用户id添加到索赔列表中
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("UserId", user.Id.ToString()));
我假设您已经知道如何在完成这一最终令牌生成之前执行这些步骤,这是从您的问题中显示的oAuth
和JWT
的能力中扣除的
从访问令牌检索声明
为了从他们的访问令牌中读取用户标识,让我们创建两个帮助器/扩展方法来帮助我们从控制器的RequestContext
中读取访问令牌
public static string GetUserId(this ControllerBase controller)
{
string securityKey = "{YOUR_SECURITY_KEY}";
SymmetricSecurityKey key = new SymmetricSecurityKey(new UTF8Encoding().GetBytes(securityKey));
JwtSecurityTokenHandler token_handler = new JwtSecurityTokenHandler();
var tokenValidationParams = new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = key,
ValidateLifetime = false
};
string bearer = controller.HttpContext.Request.Headers["Authorization"].ToString().Replace("Bearer", string.Empty).Trim(' ');
List<Claim> claims = token_handler.ValidateToken(bearer, tokenValidationParams, out SecurityToken token).Claims.ToList();
Claim userClaim = claims.FirstOrDefault(x => x.Type == "UserId");
if(userClaim != null)
{
return userClaim.Value;
}
else
{
throw new Exception("Invalid AccessToken. UserId claim not found");
}
}
问得好,我上周也遇到了同样的问题,最后用同样的JWTAccessToken
解决了
问题在于,在生成可在服务器中检索的访问令牌时,将经过身份验证的用户的UserId添加为声明
添加访问令牌的声明
首先将用户id添加到索赔列表中
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("UserId", user.Id.ToString()));
我假设您已经知道如何在完成这一最终令牌生成之前执行这些步骤,这是从您的问题中显示的oAuth
和JWT
的能力中扣除的
从访问令牌检索声明
为了从他们的访问令牌中读取用户标识,让我们创建两个帮助器/扩展方法来帮助我们从控制器的RequestContext
中读取访问令牌
public static string GetUserId(this ControllerBase controller)
{
string securityKey = "{YOUR_SECURITY_KEY}";
SymmetricSecurityKey key = new SymmetricSecurityKey(new UTF8Encoding().GetBytes(securityKey));
JwtSecurityTokenHandler token_handler = new JwtSecurityTokenHandler();
var tokenValidationParams = new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = key,
ValidateLifetime = false
};
string bearer = controller.HttpContext.Request.Headers["Authorization"].ToString().Replace("Bearer", string.Empty).Trim(' ');
List<Claim> claims = token_handler.ValidateToken(bearer, tokenValidationParams, out SecurityToken token).Claims.ToList();
Claim userClaim = claims.FirstOrDefault(x => x.Type == "UserId");
if(userClaim != null)
{
return userClaim.Value;
}
else
{
throw new Exception("Invalid AccessToken. UserId claim not found");
}
}
我实际上是在生成令牌的Auth0服务的上下文中说的。不过,我很感激你的回答并接受了。话虽如此,在Auth0服务中,可以通过“规则”向access\u令牌添加自定义声明。我可以在access\u令牌
中包含userId、名字、姓氏和用户的电子邮件地址。Auth0正在生成access\u令牌,因此答案的第一部分是不相关的。至于您答案的第二部分,JWTBearrer身份验证处理程序将为您完成所有这一切,声明将在ClaimsPrincipalHttpContext.User
(参见ControllerBase.User
)上提供<在控制器中,只需调用var id=User.Claims.FirstOrDefault(x=>x.Type==“UserId”),即可访问code>UserId
代码>。这不应该是一个被接受的答案。我实际上是在生成令牌的Auth0服务的上下文中说的。不过,我很感激你的回答并接受了。话虽如此,在Auth0服务中,可以通过“规则”向access\u令牌添加自定义声明。我可以在access\u令牌
中包含userId、名字、姓氏和用户的电子邮件地址。Auth0正在生成access\u令牌,因此答案的第一部分是不相关的。至于您答案的第二部分,JWTBearrer身份验证处理程序将为您完成所有这一切,声明将在ClaimsPrincipalHttpContext.User
(参见ControllerBase.User
)上提供<在控制器中,只需调用var id=User.Claims.FirstOrDefault(x=>x.Type==“UserId”),即可访问code>UserId
代码>。这不应是可接受的答案。有关用户的信息是从访问令牌检索的。您只需通过指定作用域(例如usopenid profile
)来指定希望从身份提供者获得的声明。然后,通常可以使用api项目中的User.claims
访问声明。sub
声明是用户id。有关用户的信息从访问令牌中检索。您只需通过指定作用域(例如usopenid profile
)来指定希望从身份提供者获得的声明。然后,通常可以使用api项目中的User.claims
访问声明。sub
声明是用户id。