Отправка идентификатора пользователя вместе с access_token - PullRequest
0 голосов
/ 08 сентября 2018

Я реализую Auth0 в своем приложении ASP.NET Core 2.1 с React-интерфейсом.

Как только пользователь проходит аутентификацию, я получаю access_token и id_token. Я понимаю, что цель access_token - предоставить доступ к моим методам API. Я также понимаю, что id_token предоставляет пользовательские данные, которые я могу использовать в своем внешнем приложении.

Вопрос / проблема касаются отправки пользовательских данных, таких как userId, в мой бэкэнд, когда я выполняю вызовы API. Кроме включения userId в тело моего POST запроса, есть ли другой способ отправить его в мой метод API?

До Auth0 я использовал несколько других решений, и JWT token, которые я получал от них, всегда включал userId, username и т. Д. Я думал, что это был более безопасный подход, потому что хотя можно увидеть, что в JWT token подпись позволяет нам убедиться, что данные не закалены.

Несмотря на то, что мои вызовы API защищены с помощью SSL, я чувствую, что включение userId человека, выполняющего вызов API, в тело моего запроса менее безопасно по сравнению с отправкой его через JWT token.

Я что-то здесь упускаю или мы действительно отправляем userId обычными средствами в вызове API, т. Е. В теле вызова POST или в строке запроса вызова GET?

1 Ответ

0 голосов
/ 08 сентября 2018

Хороший вопрос, чувак, на прошлой неделе я столкнулся с той же проблемой и, наконец, понял, используя тот же JWTAccessToken.

Подвох заключается в добавлении UserId аутентифицированного пользователя в качестве заявки при создании токена доступа, который вы можете получить на сервере.

Добавление заявок на доступ к токену

Сначала добавьте идентификатор пользователя в список претензий.

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, показанного выше в вашем вопросе.

Получить заявку из токена доступа

Чтобы прочитать UserId из их access_token, давайте создадим несколько вспомогательных методов / методов расширения, которые помогут нам прочитать access_token из 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");
    }
}

Как использовать

Давайте теперь воспользуемся этим, чтобы получить UserId в любом из наших контроллеров:

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

        // --> continuing code goes here.
    }
}
...