C#中的GSSAPI和Active Directory

时间:2012-12-04 15:30:47

标签: c# active-directory gssapi

这可能是一个愚蠢的问题,但是可以从Active Directory获取当前登录用户的GSSAPI令牌吗?

我有一个连接到服务器的简单库。我可以传递用户名,密码和域名或GSS令牌(base64)。 现在第一种方法适用于我,但是用户必须输入密码才很烦人。

我找不到任何有关GSSAPI的信息,并且它与Active Directory集成。

在C#中可以吗?

基于@Harvey Kwok的更多信息评论: 库名为Altair COM,用于文档管理

以下是关于使用GSS登录的一些API参考:

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
}

但我必须输入该令牌,我仍在尝试为当前用户生成它。

2 个答案:

答案 0 :(得分:2)

不要浪费你的时间。在C#中使用带P / Invoke的SSPI。

答案 1 :(得分:0)

Microsoft有一个在托管C ++中使用SSPI的例子(很容易从C#调用):http://msdn.microsoft.com/en-us/library/ms973911.aspx

  

为什么不用C#写呢?我尝试用C#和Managed C ++编写程序集。我很快发现了一个基本的权衡:我是否想要使用托管语言(如C#)处理非托管代码(如SSPI),还是想用C ++编写它并使用托管扩展来连接.NET世界? / p>      

使用SSPI,有许多具有复杂参数的函数。这包括许多指针,(嵌套)结构等。在C#中编写程序集意味着必须声明SSPI函数参数的托管版本(所有这些复杂类型),然后确保它们在将它们传递给非托管函数时正确地固定在内存中。

     

在托管C ++中编写程序集意味着在其本机环境中处理非托管类型。您不必担心固定,也不必重新声明类型(只需拉入相应的头文件)。

     

构建Microsoft.Samples.Security.SSPI时,我发现在Managed C ++中更容易完成这项工作。所有复杂类型都保存在未管理的世界中;非托管API在其本机C环境中处理。托管C ++提供了一种弥合非托管/托管世界之间差距的好方法。

     

您的里程可能会有所不同,选择取决于所使用的API。但是对于SSPI,托管扩展比C#等更高级别的语言更有意义。