获取SSO的Kerberos令牌

时间:2019-03-27 18:15:30

标签: c# single-sign-on token kerberos

我正在尝试为登录Windows的当前用户获取Kerberos令牌,以向接受Kerberos身份验证的REST服务发出请求。

基于此问题的解决方案,我正在使用以下C代码: How to get Service Token from Kerberos using SSPI

变量域和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 个答案:

答案 0 :(得分:2)

以下行不正确:

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

请记住,SPN必须在Active Directory中注册到服务主体,否则客户端将无法查找服务。