Хороший вопрос, чувак, на прошлой неделе я столкнулся с той же проблемой и, наконец, понял, используя тот же 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.
}
}