2009-03-14 4 views
13

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

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

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

ответ

17

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

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

Тогда вы должны знать, где наборы претензии приходят от:

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

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

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

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

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

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

+1

В случае, если кто-либо заинтересован, я не уверен, что SecurityToken должен быть создан на стороне клиента и передан на сервер. Для обеспечения безопасности X.509 имеет смысл инициировать SslStream с сервером и создавать X509SecurityToken из сертификата сервера, для обеспечения безопасности Windows WindowsSecurityToken может быть создан из negotiateStream.RemoteIdentity, если используется NegotiateStream. Для безопасности имени пользователя и пароля, конечно, необходимо будет указать имя пользователя и пароль. – dtb

7

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

+1

Я отредактировал ответ @ dtb выше, чтобы отразить фиксированные ссылки.Он должен появиться, как только он будет рассмотрен экспертом. Благодаря! –

+0

По состоянию на сентябрь 2016 года некоторые из ссылок – JPK

 Смежные вопросы

  • Нет связанных вопросов^_^