Как получить претензии из аутентифицированного 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 для проверки и получения коллекции претензий.

https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.validatetoken(v=vs.110).aspx

Другие вопросы по тегам