Получение Kerberos Token для SSO - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь получить токен Kerberos для текущего пользователя, вошедшего в Windows, чтобы сделать запрос службе REST, которая принимает аутентификацию Kerberos.

Я использую следующий код C, основанный на решении этоговопрос: Как получить служебный токен из Kerberos с помощью SSPI

Кажется, что переменные domain и foundUser установлены правильно.Но сетевые учетные данные пусты.Это приводит к тому, что вызов k1.GetToken () выдает ошибку System.IdentityModel.Tokens.SecurityTokenValidationException.

Как получить токен Kerberos для пользователя?

    public String getToken(string userName)
    {
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        var domain = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().ToString();
        using (var domainContext = new PrincipalContext(ContextType.Domain, domain))
        {
            using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName))
            {
                NetworkCredential networkCred = System.Net.CredentialCache.DefaultNetworkCredentials;
                string spn = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName).UserPrincipalName;
                KerberosSecurityTokenProvider k1 = new KerberosSecurityTokenProvider(spn, System.Security.Principal.TokenImpersonationLevel.Impersonation, networkCred);
                KerberosRequestorSecurityToken T1 = k1.GetToken(TimeSpan.FromMinutes(1)) as KerberosRequestorSecurityToken;
                string sret = Convert.ToBase64String(T1.GetRequest());
                return sret;
            }
        }

    }

1 Ответ

2 голосов
/ 28 марта 2019

Следующая строка неверна:

KerberosSecurityTokenProvider k1 = new KerberosSecurityTokenProvider(spn, System.Security.Principal.TokenImpersonationLevel.Impersonation, networkCred);

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

Смысл параметра SPN - указать имя службы , на которую вы хотите получить билет.Kerberos не позволяет вам просто получить билет, который можно использовать где угодно.Вы должны запросить билет на определенную услугу.

SPN принимает форму service/host.com@optional.realm.com.Поскольку это REST-сервис, он, скорее всего, будет HTTP/your.service.com.

Имейте в виду, что имя участника-службы должно быть зарегистрировано на субъекте службы в Active Directory, в противном случае клиент не сможет искать службу.

...