2016-06-14 29 views
2

目標: 我正嘗試構建概念驗證客戶端應用程序以通過使用SSPI實現單點登錄。我是C#的新手,我感到困惑。如何使用SSPI從Kerberos獲取服務令牌

我所知道的和已經完成的工作: 所有用戶都是Active Directory域的一部分,所以我知道在登錄過程中被用於身份驗證的Kerberos。我現在需要做的就是從Kerberos獲取服務令牌,以便將其傳遞給服務資源而不是用戶名和密碼(如果我錯了,請糾正我)。我已經提供了服務主體名稱(SPN)和密碼,該密碼已在Kerberos中註冊用於該服務。

我希望不要使用平臺調用服務來調用SSPI函數,但我會如果我必須。我通讀了「.NET Remoting認證和授權示例 - 第一部分」,並使用Microsoft.Samples.Security.SSPI進行測試。我也嘗試使用C#/.Net Interface To The Win32 SSPI Authentication API

到目前爲止,我可以獲取用戶/客戶端憑據,構建客戶端安全上下文。但是,如何爲給定的SPN申請服務票?

我將不勝感激您的幫助和指導。如果可以,請具體說明,如果您有任何問題,請告訴我。

+0

鏈接到「.NET遠程身份驗證和授權樣品 - 第一部分」被‘https://msdn.microsoft.com/en-us/library/ms973911.aspx’我現在不能在問題的主體中添加兩個以上的鏈接 –

+0

您將要發言的有線協議是什麼?自定義還是標準? –

+0

標準。我們沒有使用任何自定義協議。 –

回答

1

您可以使用下面通過給SPN由Hasanthi提供

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,需要發生三個主要步驟。首先是驗證客戶端並獲取票證授予票證。其次是使用Ticket Granting Ticket請求服務的票證,第三個是讓服務驗證客戶請求的票證。 上面的代碼示例讓我感到困惑,因爲username變量用於foundUser和spn。你能詳細解答並指定哪一個是真正的客戶用戶和服務用戶嗎? –

+0

嗨,上面的代碼說明了如何獲取給定spn的票證。這裏的用戶名是AD用戶的登錄名,通過使用該方法它將創建spn作爲登錄名@域。通過使用該spn,您可以生成票證。我也在做同樣的任務,我正在關注Win32 SSPI認證API的C#/ .Net接口。我也可以通過使用nsspi獲得TGT並尋找獲得SGT的方法:) – Hasanthi

+0

請查看:https://github.com/antiduh/nsspi/issues/3 – Hasanthi

1

代碼工作完全爲我需要獲得令牌,我沒有使用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服務器獲取密鑰。 –

相關問題