Передача параметра 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. Конструктор этого класса находится здесь и зависит от нескольких параметров.

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

Вопросы:

  1. Нужно ли что-то добавить в мои веб-настройки, чтобы сделать это возможным
    без поста?
  2. Могу ли я сериализовать SecurityToken и отправить его на веб-сайт B и снова десериализовать его со всеми исходными значениями (что является подходом в данном случае).

1 ответ

Правильным решением было бы использовать STS, который оба веб-сайта используют для аутентификации. Размещать токены вручную немного глупо.

Тем не менее, вы можете создать GenericXmlSecurityToken из строки XML. IIRC вы можете просто пройти null на все аргументы ctor, о которых вы не знаете.