Как использовать System.IdentityModel в собственном клиент-серверном приложении - PullRequest
13 голосов
/ 14 марта 2009

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

WCF использует пространство имен System.IdentityModel для целей аутентификации, но , очевидно, , которое может использоваться в произвольных приложениях - что звучит интересно. Информация о том, как это сделать, немногочисленна (или мой Google Foo сегодня слаб).

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

Ответы [ 2 ]

17 голосов
/ 15 марта 2009

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

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

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

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

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

  1. Клиент создает SecurityToken, используя SecurityTokenProvider
  2. Клиент сериализует SecurityToken, используя SecurityTokenSerializer
  3. Сервер десериализует SecurityToken, используя SecurityTokenSerializer
  4. Сервер создает IAuthorizationPolicy с использованием SecurityTokenAuthenticator
  5. Сервер создает AuthorizationContext из IAuthorizationPolicy s
  6. Готово
* 1 072 * Пример:
// 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 s используйте X509SecurityTokenProvider / Authenticator. Для WindowsSecurityToken s есть WindowsSecurityTokenAuthenticator, но нет поставщика; вместо этого используйте конструктор WindowsSecurityToken:

var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());

Это работает довольно хорошо. Единственное, что я опускал до сих пор, это сериализация токена. Существует класс SecurityTokenSerializer, который имеет одну реализацию в .NET Framework: класс WSSecurityTokenSerializer, который поставляется с WCF.

Сериализация UserNameSecurityToken s и X509SecurityToken s работает как брелок (не пробовал десериализацию), но WindowsSecurityToken s, очевидно, не поддерживаются сериализатором. Это оставляет меня с двумя методами аутентификации, которые у меня уже есть (сертификаты и имя пользователя / пароль), и, так как я не хотел этого AuthorizationContext в любом случае, я буду придерживаться того, что имею:)

7 голосов
/ 07 февраля 2013

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

...