Fur*_*tov 5 .net c# kerberos sspi single-sign-on
目标: 我正在尝试使用SSPI构建Proof Of Concept客户端应用程序以实现单点登录.我是C#的新手,我很困惑.
到目前为止我所知道和完成的事情: 所有用户都是Active Directory域的一部分,因此我知道Kerberos在登录期间用于身份验证.此时我需要做的就是从Kerberos获取服务令牌,这样我就可以将它传递给服务资源而不是用户名和密码(如果我错了,请纠正我).我已经获得了服务原则名称(SPN)和已在Kerberos中注册的服务密码.
我希望不要使用平台调用服务来调用SSPI函数,但是如果必须的话,我会这样做.我通读了".NET Remoting身份验证和授权示例 - 第一部分",并使用Microsoft.Samples.Security.SSPI进行测试.我还尝试使用C#/ .Net接口到Win32 SSPI身份验证API.
到目前为止,我可以获得用户/客户端凭据,构建客户端安全上下文.但是,如何为给定的SPN请求服务票证?
非常感谢您的帮助和指导.如果可以,请具体说明如果您有任何疑问,请告诉我.
您可以使用下面的方法通过提供 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)