Как использовать систему.Создайте модель идентификации в собственном клиент-серверном приложении
-
22-07-2019 - |
Вопрос
У меня есть простое клиент-серверное приложение, основанное на TcpClient / TcpListener и SslStream.Клиенты могут аутентифицироваться на сервере, используя сертификат x509 или отправив имя пользователя и пароль после установления SslStream.
WCF использует Система.Модель идентификации пространство имен для целей аутентификации, но очевидно это может быть использовано в произвольных приложениях, что звучит интересно.Однако информации о том, как это сделать, немного (или мой Google foo сегодня слаб).
Итак, мой вопрос заключается в следующем: Что мне нужно сделать, чтобы интегрировать System.IdentityModel с моим приложением? Я не уверен, нужны ли мне все эти утверждения, но было бы неплохо, если бы пользователи могли входить в систему, просто используя свою учетную запись Windows или любой другой предоставленный механизм аутентификации.(К сожалению, я не могу просто переключиться на WCF, но вынужден использовать пользовательский протокол, хотя при необходимости я могу внести в него некоторые изменения.)
Решение
Мой Google foo действительно был слабым.Ответ находится прямо за ссылкой в моем вопросе.Итак, вот пара ссылок на этот блог на случай, если у кого-нибудь в конце концов возникнет такой же вопрос.
Во-первых, вы должны попытаться понять "этот набор утверждений".:
- Требования
- Наборы утверждений
- Проверка наборов утверждений
- Наборы утверждений Windows и X509Certificate
- Типичные операции с наборами утверждений
Затем вам нужно знать, откуда берутся наборы утверждений:
- Политики авторизации, контекст и преобразование утверждений
- Преобразование утверждений в WCF
- Контекст авторизации и преобразование утверждений за пределами WCF
Вооружившись этими знаниями, на самом деле все становится довольно просто.
Если я правильно понимаю, основной рабочий процесс будет примерно таким:
- Клиент создает
SecurityToken
используяSecurityTokenProvider
- Клиент сериализует
SecurityToken
используяSecurityTokenSerializer
- Сервер десериализует
SecurityToken
используяSecurityTokenSerializer
- Сервер создает
IAuthorizationPolicy
ы, использующиеSecurityTokenAuthenticator
- Сервер создает
AuthorizationContext
ОтIAuthorizationPolicy
s - Выполнено
Пример:
// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");
// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;
// ... transmit SecurityToken to server ...
// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
UserNamePasswordValidator.None);
// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);
// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);
Для X509SecurityToken
ы используют a X509SecurityTokenProvider
/Authenticator
.Для WindowsSecurityToken
субъект, там есть WindowsSecurityTokenAuthenticator
но не провайдер;вместо этого используйте WindowsSecurityToken
конструктор:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Это работает довольно хорошо.Единственное, что я опустил до сих пор выше, - это сериализация токенов.Существует SecurityTokenSerializer
класс, который имеет одну реализацию в .NET framework:тот самый WSSecurityTokenSerializer
класс, который поставляется вместе с WCF.
Сериализация UserNameSecurityToken
ы и X509SecurityToken
s работает как шарм (еще не пробовал десериализацию), но WindowsSecurityToken
s, по-видимому, не поддерживаются сериализатором.Это оставляет меня с двумя методами аутентификации, которые у меня уже есть (сертификаты и имя пользователя / пароль), и, поскольку я этого не хотел AuthorizationContext
в любом случае, я буду придерживаться того, что у меня есть :)
Другие советы
У меня нет репутации, чтобы оставлять комментарии к существующему решению, но я хотел бы опубликовать новые URL-адреса в блогах, перечисленных в решении, поскольку они больше не работают.Если кто-нибудь сможет изменить это на комментарий, я был бы вам очень признателен.
- Требования
- Наборы утверждений
- Проверка наборов утверждений
- Наборы утверждений сертификатов Windows и X509
- Типичные операции с наборами утверждений
- Политики авторизации, контекст и преобразование утверждений
- Преобразование утверждений в WCF
- Контекст авторизации и преобразование утверждений за пределами WCF