发送用户ID和access_token

时间:2018-09-07 22:40:13

标签: authentication asp.net-core jwt auth0

我正在使用React前端在ASP.NET Core 2.1应用中实现Auth0。

用户进行身份验证后,我将同时获得一个access_token和一个id_token。我很清楚access_token的目的是授予对我的API方法的访问权限。我也了解id_token提供了可以在前端应用程序中使用的用户数据。

问题/担忧是关于在进行API调用时将用户数据(例如userId)发送到我的后端。除了在我的userId请求的正文中包含POST之外,还有其他方法可以将其发送到我的API方法吗?

在Auth0之前,我使用了其他一些解决方案,并且从他们那里收到的JWT token始终包括userIdusername等。我认为这是一种更安全的方法,因为即使可以看到JWT token中的内容,签名也使我们可以确保数据不会受到破坏。

即使我的API调用是通过SSL保护的,但与在userId中发送API调用的人相比,在我的请求正文中包含JWT token的安全性却不那么安全{1}}。

我是否在这里丢失了某些信息,还是确实通过常规方法在API调用中(即在userId调用的正文中或在{{1}的查询字符串中)发送了POST }致电?

1 个答案:

答案 0 :(得分:-1)

好问的人,我上周遇到了同样的问题,最后使用相同的JWTAccessToken来解决。

难点在于,在生成可在服务器中检索的访问令牌时,将经过身份验证的用户的 UserId 添加为声明。

添加声明以访问令牌

首先将用户的ID添加到您的声明列表中。

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
                     );

假设您已经知道如何从达到上述问题的oAuthJWT的能力中扣除最终的代币生成之前执行这些步骤。

从访问令牌检索声明

要从其access_token读取 UserId ,我们创建几个帮助程序/扩展方法,以帮助我们从控制器的RequestContext读取access_token。

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");
    }
}

使用方法

现在让我们使用它来获取我们任意一个控制器中的 UserId

[Authorize]
public class ExampleController : Controller
{
    public IActionResult Index()
    {
        string userId = this.GetUserId();

        // --> continuing code goes here.
    }
}
相关问题