Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 正在发送用户Id和访问令牌_Authentication_Asp.net Core_Jwt_Auth0 - Fatal编程技术网

Authentication 正在发送用户Id和访问令牌

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之前,我使用了一些其

我正在我的ASP.NET Core 2.1应用程序中使用React前端实现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身份验证处理程序将为您完成所有这一切,声明将在ClaimsPrincipal
HttpContext.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身份验证处理程序将为您完成所有这一切,声明将在ClaimsPrincipal
HttpContext.User
(参见
ControllerBase.User
)上提供<在控制器中,只需调用
var id=User.Claims.FirstOrDefault(x=>x.Type==“UserId”),即可访问code>UserId
。这不应是可接受的答案。有关用户的信息是从访问令牌检索的。您只需通过指定作用域(例如us
openid profile
)来指定希望从身份提供者获得的声明。然后,通常可以使用api项目中的
User.claims
访问声明。
sub
声明是用户id。有关用户的信息从访问令牌中检索。您只需通过指定作用域(例如us
openid profile
)来指定希望从身份提供者获得的声明。然后,通常可以使用api项目中的
User.claims
访问声明。
sub
声明是用户id。