Передача параметра SecurityToken на другой веб-сайт asp.net mvc в POST не позволяет использовать Single Sing-On
У меня есть несколько веб-сайтов A, B, C ..... Веб-сайт A: это веб-сайт аутентификации, в зависимости от имени пользователя, пароля и дополнительного параметра; Веб-сайт A перенаправляет успешный логин пользователя на веб-сайт B. Когда пользователь входит в систему, я получаю на веб-сайте A токен, полученный из System.IdentityModel.Tokens.SecurityToken. Моим первым подходом была попытка передать этот токен на другой веб-сайт через запрос POST, но безуспешно, потому что токен слишком велик. Сначала я подумал, что это сериализуемо, но нет: GenericXmlSecurityToken можно преобразовать в XML с помощью ToTokenXmlString(). Это метод расширения для Thinktecture.IdentityModel.Extensions, ниже я прилагаю описание класса
public static class SecurityTokensExtensions
{
public static ClaimsPrincipal ToClaimsPrincipal(this SecurityToken token, SecurityTokenHandlerCollection handler);
public static ClaimsPrincipal ToClaimsPrincipal(this SecurityToken token, X509Certificate2 signingCertificate);
public static ClaimsPrincipal ToClaimsPrincipal(this SecurityToken token, X509Certificate2 signingCertificate, string audienceUri);
public static SecurityToken ToSecurityToken(this GenericXmlSecurityToken token);
public static SecurityToken ToSecurityToken(this GenericXmlSecurityToken token, SecurityTokenHandlerCollection handler);
public static SecurityToken ToSecurityToken(this GenericXmlSecurityToken token, X509Certificate2 decryptionCertificate);
public static string ToTokenXmlString(this GenericXmlSecurityToken token);
public static string ToTokenXmlString(this SecurityToken token);
public static string ToTokenXmlString(this SecurityToken token, SecurityTokenHandlerCollection handler);
}
Как вы можете видеть, мы можем преобразовать XML в String, но ни один из перечисленных выше методов не принимает эту строку и возвращает SecurityToken, вместо этого они принимают GenericXmlSecurityToken. Конструктор этого класса находится здесь и зависит от нескольких параметров.
Вопросы:
- Нужно ли что-то добавить в мои веб-настройки, чтобы сделать это возможным
без поста? - Могу ли я сериализовать SecurityToken и отправить его на веб-сайт B и снова десериализовать его со всеми исходными значениями (что является подходом в данном случае).
1 ответ
Правильным решением было бы использовать STS, который оба веб-сайта используют для аутентификации. Размещать токены вручную немного глупо.
Тем не менее, вы можете создать GenericXmlSecurityToken из строки XML. IIRC вы можете просто пройти null
на все аргументы ctor, о которых вы не знаете.