代码之家  ›  专栏  ›  技术社区  ›  Sam

发送用户Id和访问令牌

  •  0
  • Sam  · 技术社区  · 6 年前

    我正在我的系统中实现Auth0ASP.NET核心2.1应用与反应前端。

    一旦用户进行了身份验证,我就会得到 access_token 和一个 id_token 是授权访问我的API方法。我也明白 身份证

    问题/关注点是关于发送用户数据,例如 userId 用户ID 在我的身体里 POST 请求,是否有其他方法将其发送到我的API方法?

    在Auth0之前,我使用了一些其他解决方案和 JWT token 用户ID , username JWT代币 ,签名允许我们确保数据不被篡改。

    SSL ,我觉得包括 用户ID 在我的请求体中进行API调用的人的安全性比通过 JWT代币 .

    我是不是漏掉了什么东西,还是我们真的寄了信 用户ID 岗位 GET

    1 回复  |  直到 6 年前
        1
  •  -1
  •   Timothy Macharia astallaslions    6 年前

    问得好,我上周也遇到同样的问题,最后用同样的方法解决了 JWTAccessToken .

    关键在于添加 在生成可在服务器中检索的访问令牌时,作为声明的身份验证用户。

    添加对访问令牌的声明

    List<Claim> claims = new List<Claim>();
    claims.Add(new Claim("UserId", user.Id.ToString()));
    

    然后生成一个访问令牌。

    SecurityToken token = new JwtSecurityToken(
                            issuer: {YOUR_ISSUER},
                            audience: {YOUR_AUDIENCE},
                            claims: claims,
                            notBefore: DateTime.UtcNow,
                            expires: DateTime.UtcNow.AddMinutes(60),
                            signingCredentials: credentials
                         );
    

    我假设你已经知道如何执行步骤之前,达到这最后一代代币扣除你的技能 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");
        }
    }
    

    如何使用

    现在让我们用这个来得到 用户ID 在我们的任何控制器中:

    [Authorize]
    public class ExampleController : Controller
    {
        public IActionResult Index()
        {
            string userId = this.GetUserId();
    
            // --> continuing code goes here.
        }
    }