2016-06-14 8 views
2

Цель: Я пытаюсь создать приложение-клиент Proof Of Concept для реализации Single Sign On с помощью SSPI. Я новичок в C#, и я сбиваюсь с толку.Как получить Сервисный токен из Kerberos с использованием SSPI

То, что я знаю, и сделал до сих пор: Все пользователи являются частью домена Active Directory, поэтому я знаю, Kerberos используется для проверки подлинности при входе в систему. Все, что мне нужно сделать в этот момент, - это получить токен сервисов от Kerberos, чтобы я мог передать его в ресурс службы вместо имени пользователя и пароля (исправьте меня, если я ошибаюсь). Мне предоставлено имя принципа обслуживания (SPN) и пароль, который был зарегистрирован в Kerberos для этой службы.

Я надеялся не использовать Службы Invocation для вызова функций SSPI, но я буду, если понадобится. Я прочитал «.NET Remoting Authentication and Authorization Sample - Part I» и использовал для тестирования тестирование Microsoft.Samples.Security.SSPI. Я также пробовал использовать C#/.Net Interface To The Win32 SSPI Authentication API.

До сих пор я могу получить учетные данные пользователя и клиента, создать контекст безопасности клиента. Но как я могу запросить билет на услугу для данного SPN?

Буду признателен за вашу помощь и руководство. Пожалуйста, будьте конкретны, если можете и дайте мне знать, если у вас есть какие-либо вопросы.

+0

Ссылка на «Проверка подлинности .NET Remoting и авторизации образца - Часть I» является „https://msdn.microsoft.com/en-us/library/ms973911.aspx“ Я не могу добавить более двух ссылок в основную часть вопроса прямо сейчас –

+0

Каков протокол проводов, который вы собираетесь говорить? Пользовательский или стандартный? –

+0

Стандарт. Мы не используем какие-либо пользовательские протоколы. –

ответ

1

Вы можете использовать ниже, чтобы получить маркер, давая SPN

public String getToken(string userName) 
    { 
    using (var domainContext = new PrincipalContext(ContextType.Domain, "domain")) 
     { 
      using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName)) 
      { 
       Console.WriteLine("User Principale name" + UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName).UserPrincipalName); 
       string spn = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName).UserPrincipalName; 
       KerberosSecurityTokenProvider k1 = new KerberosSecurityTokenProvider(spn, System.Security.Principal.TokenImpersonationLevel.Impersonation, new System.Net.NetworkCredential(userName, "password", "domain")); 
       KerberosRequestorSecurityToken T1 = k1.GetToken(TimeSpan.FromMinutes(1)) as KerberosRequestorSecurityToken; 
       string sret = Convert.ToBase64String(T1.GetRequest()); 
       Console.WriteLine("=====sret========" + sret); 
       return sret; 
      } 
     } 

    } 
+0

Спасибо за ответ, не могли бы вы рассказать о следующем? С Kerberos есть три основных шага, которые должны произойти. Сначала выполняется аутентификация клиента и получение билета на получение билетов. Во-вторых, запрашивается билет для Сервиса с использованием Билета на подачу билета, а третий - с услугой, подтверждающей билет, который клиент запросил для него. С приведенным выше примером кода я смущен, потому что переменная имени пользователя используется для foundUser и spn. Можете ли вы уточнить ответ и указать, кто действительно пользователь и пользователь сервиса, пожалуйста? –

+0

Привет, в приведенном выше коде говорится, как вы можете получить билет для данного spn. Здесь имя пользователя является именем входа пользователя AD, и с помощью метода он создаст spn как имя входа в домен @. Используя этот spn, вы можете сгенерировать билет.Я также выполняю такую ​​же задачу, и я следую C# /. Net Interface для API аутентификации Win32 SSPI. Я мог бы также получить TGT, используя nsspi и искать способ получить SGT :) – Hasanthi

+0

. Посмотрите: https://github.com/antiduh/nsspi/issues/3 – Hasanthi

1

кодов, поставляемая Hasanthi работал отлично для моей потребности, и я не должен использовать SSPI. Я задавал неправильные вопросы, но я много узнал о Kerberos и SSPI. Вот мой код в двух словах:

AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal); 
var domain = Domain.GetCurrentDomain().ToString(); 

using (var domainContext = new PrincipalContext(ContextType.Domain, domain)) 
{ 
    string spn = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, serviceName).UserPrincipalName; 
    KerberosSecurityTokenProvider tokenProvider = new KerberosSecurityTokenProvider(spn, System.Security.Principal.TokenImpersonationLevel.Impersonation, CredentialCache.DefaultNetworkCredentials); 
    KerberosRequestorSecurityToken securityToken = tokenProvider.GetToken(TimeSpan.FromMinutes(1)) as KerberosRequestorSecurityToken; 
    string serviceToken = Convert.ToBase64String(securityToken.GetRequest()); 
} 
+0

Знаете ли вы, как идти назад и получить имя участника-пользователя из «serviceToken»? Возможно ли это? –

+0

Я не реализовал серверную сторону, но это возможно. Я считаю, что имя участника-пользователя включено в токен службы, и для его расшифровки вам нужно будет получить ключ от сервера Kerberos, который выдал токен. –