Как получить претензии из аутентифицированного SecurityToken
Я передаю токен в виде строки в службу SOAP и проверил, что токен действителен. Теперь у меня есть SecurityToken, который в режиме отладки позволяет видеть все утверждения и, в частности, утверждение userId, которое я хотел бы передать другому методу. Я не могу понять, как добраться до претензий. На данный момент я расшифровал строковую версию токена (не проверенную строковую версию токена, я, по крайней мере, дождался после успешной проверки.) Вот этот блок кода:
SecurityToken validatedToken = null;
if (VerifyToken(sPassword, ref response, ref validatedToken))
{
var claimsObj = JObject.Parse(Encoding.UTF8.GetString(Base64Url.Decode(claims)));
JToken userId = claimsObj.GetValue("userId");
return implClass.Process(userId);
}
Как получить претензии от SecurityToken?
validatedToken.Id; // not it
validatedToken.ToClaimsPrincipal(cert); // doesn't work
Ничто другое не показалось мне многообещающим в том, что касается открытых свойств, но, поскольку я могу видеть утверждения в отладчике, я уверен, что есть способ, которого я просто не вижу.
2 ответа
Я только что испытал то же самое, а именно, что во время отладки свойство Payload отображается в SecurityToken, но, по-видимому, отсутствует свойство Payload при редактировании кода.
Похоже, базовым типом SecurityToken является JwtSecurityToken (несмотря на то, что QuickWatch для securityCode.GetType() возвращает SecurityToken, а не JwtSecurityToken.). В любом случае, приведение к фактическому базовому типу и обращение к коллекции Payload сделали свое дело для меня.
Одно из решений:
string userId = ((JwtSecurityToken)access_token).Payload["userId"].ToString();
Вероятно, вы видите утверждения, потому что отладчик использует реальный тип объекта, а не базовый класс SecurityToken. Приведите это как реальный тип, и у вас должен быть более легкий доступ к претензиям.
Это, или используйте securityTokenHAndler для проверки и получения коллекции претензий.