c# - 为 SSO 获取 Kerberos 令牌
问题描述
我正在尝试为登录到 Windows 的当前用户获取 Kerberos 令牌,以向接受 Kerberos 身份验证的 REST 服务发出请求。
我正在使用基于此问题的解决方案的以下 C 代码: How to get Service Token from Kerberos using 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;
}
}
}
解决方案
以下行不正确:
KerberosSecurityTokenProvider k1 = new KerberosSecurityTokenProvider(spn, System.Security.Principal.TokenImpersonationLevel.Impersonation, networkCred);
您要告诉它为当前用户获取 Kerberos 票证,该用户的目标是具有 SPN 名称的服务,而 SPN 恰好是当前用户的名称。
SPN 参数的要点是指定您想要票证的服务的名称。Kerberos 不会让您只获得一张可以在任何地方使用的票。您必须为特定服务申请票证。
SPN 采用service/host.com@optional.realm.com
. 由于它是一个 REST 服务,它很可能是HTTP/your.service.com
.
请记住,SPN 必须注册到 Active Directory 中的服务主体,否则客户端将无法查找服务。
推荐阅读
- encoding - gedit标准文本文件的奇怪编码
- uml - UML 建模:如何显示有多个系统相互交互?
- python - 两个堆叠条形图作为子图 - 任何参考?
- ruby - ruby 中“nil”私有方法的目的是什么?
- angular - Angular 6 - 行为主题:刷新后获取数据
- c# - ICryptoTransform _NewDecryptor 不存在,但 _NewEncryptor 存在
- google-app-engine - App Engine 中没有标准错误
- php - 将字段值文本复制到页面保存 Silverstripe 3 上的 $Content 字段
- postgresql - pgsql查询返回单行以查找同一日期的差异列总数
- android - 删除底部工作表对话框片段中的白色背景