2012-12-04 60 views
0

這可能是一個愚蠢的問題,但是可以從Active Directory獲取當前登錄用戶的GSSAPI令牌嗎?C#中的GSSAPI和活動目錄

我有一個簡單的庫連接到服務器。我可以傳遞用戶名,密碼和域名或GSS令牌(base64)。 現在,第一種方法適用於我,但用戶必須輸入密碼令人討厭。

我找不到任何有關GSSAPI的信息,並且它與Active Directory集成。

在C#中可能嗎?

基於@Harvey國意見的一些更多的信息: 庫被稱爲Altair COM,它是用於文件管理

下面是關於登錄一些API的參考與GSS:

HRESULT LoginGSS(
    [in] VARIANT *token, 
    [in] VARIANT_BOOL forceCreateNew, 
    [out,retval] VARIANT *retToken) 

及以下在VB示例用法:

Dim token(tokensize) As Byte 'token size-1 
’fill token buffer 
... 
Dim outToken() As Byte 
outToken = altair.LoginGSS(token,True) 
'if GetLastStatus == AXAPI_ALTAIR_LOGIN_CONTINUE then 
'outToken contains return GSS API token 

和VC++用法

SAFEARRAYBOUND sab[1]; 
sab[0].lLbound=0; 
sab[0].cElements=tokensize; 
SAFEARRAY *sa; 
sa=SafeArrayCreate(VT_UI1,1,sab); 
unsigned char HUGEP *buf=NULL; 
SafeArrayAccessData(sa,(void HUGEP**)&buf); 
//fill token buffer 
... 
SafeArrayUnaccessData(sa); 
v.vt=VT_ARRAY|VT_UI1; 
v.pparray=sa; 
VARIANT vOut; 
pAltair->LoginGSS(&v,true,&vOut); 
SafeArrayDestroy(sa); 
'if GetLastStatus == AXAPI_ALTAIR_LOGIN_CONTINUE then 
'outToken contains return GSS API token 

這是我所有的信息。


我發現了一些代碼片段顯示登錄過程:

byte[] token; 
token = Convert.FromBase64String(tbToken.Text); 
Object o; 
o = (Object)token; 
Program.altair.LoginGSS(ref o, true); 
if ((AXAPILib.AxAPIStatus)altair.GetLastStatus()==AXAPILib.AxAPIStatus.AxAltairLoginOK) 
{ 
    //login ok 
} 

但我必須輸入令牌,我仍然在試圖生成它爲當前用戶。

+0

它是什麼簡單的庫?需要什麼標記?你在說什麼GSS令牌?我認爲這是從GSSAPI返回的上下文令牌?你在用什麼GSSAPI?您是使用MIT GSSAPI還是使用Windows SSPI? –

+0

@HarveyKwok - 我編輯了我的問題並添加了一些API參考。我目前沒有使用任何GSSAPI。正如我現在寫的,usem必須登錄到他的電腦(當然是域),然後當他開始我的申請時,他必須第二次輸入他的密碼,我想避免這種情況。我唯一的選擇是GSSAPI,但我不知道如何使用它:/ – Misiu

+0

@Misiu你設法達到這個目標嗎?我需要使用GSSAPI身份驗證連接到LDAP服務器。你能在C#中提供一些示例代碼嗎?在網上找不到任何東西 – mayooran

回答

2

不要浪費你的時間。在C#中使用SSPI和P/Invoke。

+0

我知道這可能聽起來很愚蠢,但SSPI實現了GSS-API? – Misiu

+0

是的,這是正確的。 SSPI是GSS-API的Windows專有實現。 –

+0

是否有可能添加來源代碼?我只需要初始化該令牌並使用我的API將其發送到服務器。 – Misiu

0

微軟在託管C++(這是很容易再從C#調用)使用SSPI的例子在這裏:http://msdn.microsoft.com/en-us/library/ms973911.aspx

爲什麼不能在C#寫?我嘗試用C#編寫程序集以及託管C++。我很快發現了一個基本的權衡:我是否想使用託管語言(如C#)中的非託管代碼來處理SSPI,還是想用C++編寫它,並使用託管擴展來連接到.NET世界?

使用SSPI有許多具有複雜參數的功能。這包括許多指針,(嵌套)結構等等。用C#編寫程序集意味着必須聲明SSPI函數參數的管理版本(所有這些複雜類型),然後確保在將它們傳遞給非託管函數時將它們正確地固定在內存中。

將程序集編寫爲託管C++意味着處理其本地環境中的非託管類型。你不必擔心固定,你不必重新聲明類型(只需拉入適當的頭文件)。

構建Microsoft.Samples.Security.SSPI時,我發現在Managed C++中執行這項工作比較容易。所有複雜類型都保存在非託管世界中;非託管API在其本地C環境中處理。託管C++提供了一種很好的方式來縮小非託管/託管世界之間的差距。

您的里程可能會有所不同,選擇將取決於正在使用的API。但對於SSPI,託管擴展比C#等更高級語言更有意義。

+0

感謝您的重播,但可以請您添加一些示例代碼?我從你的鏈接下載了代碼,但大部分都是用C++編寫的,這可以在沒有C++的情況下完成嗎?使用P/Invoke也許?我真的很感激一些代碼:) – Misiu