Как использовать систему.Создайте модель идентификации в собственном клиент-серверном приложении

StackOverflow https://stackoverflow.com/questions/646395

  •  22-07-2019
  •  | 
  •  

Вопрос

У меня есть простое клиент-серверное приложение, основанное на TcpClient / TcpListener и SslStream.Клиенты могут аутентифицироваться на сервере, используя сертификат x509 или отправив имя пользователя и пароль после установления SslStream.

WCF использует Система.Модель идентификации пространство имен для целей аутентификации, но очевидно это может быть использовано в произвольных приложениях, что звучит интересно.Однако информации о том, как это сделать, немного (или мой Google foo сегодня слаб).

Итак, мой вопрос заключается в следующем: Что мне нужно сделать, чтобы интегрировать System.IdentityModel с моим приложением? Я не уверен, нужны ли мне все эти утверждения, но было бы неплохо, если бы пользователи могли входить в систему, просто используя свою учетную запись Windows или любой другой предоставленный механизм аутентификации.(К сожалению, я не могу просто переключиться на WCF, но вынужден использовать пользовательский протокол, хотя при необходимости я могу внести в него некоторые изменения.)

Это было полезно?

Решение

Мой Google foo действительно был слабым.Ответ находится прямо за ссылкой в моем вопросе.Итак, вот пара ссылок на этот блог на случай, если у кого-нибудь в конце концов возникнет такой же вопрос.

Во-первых, вы должны попытаться понять "этот набор утверждений".:

Затем вам нужно знать, откуда берутся наборы утверждений:

Вооружившись этими знаниями, на самом деле все становится довольно просто.

Если я правильно понимаю, основной рабочий процесс будет примерно таким:

  1. Клиент создает SecurityToken используя SecurityTokenProvider
  2. Клиент сериализует SecurityToken используя SecurityTokenSerializer
  3. Сервер десериализует SecurityToken используя SecurityTokenSerializer
  4. Сервер создает IAuthorizationPolicyы, использующие SecurityTokenAuthenticator
  5. Сервер создает AuthorizationContext От IAuthorizationPolicys
  6. Выполнено

Пример:

// 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ы и X509SecurityTokens работает как шарм (еще не пробовал десериализацию), но WindowsSecurityTokens, по-видимому, не поддерживаются сериализатором.Это оставляет меня с двумя методами аутентификации, которые у меня уже есть (сертификаты и имя пользователя / пароль), и, поскольку я этого не хотел AuthorizationContext в любом случае, я буду придерживаться того, что у меня есть :)

Другие советы

У меня нет репутации, чтобы оставлять комментарии к существующему решению, но я хотел бы опубликовать новые URL-адреса в блогах, перечисленных в решении, поскольку они больше не работают.Если кто-нибудь сможет изменить это на комментарий, я был бы вам очень признателен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top