这可能是一个愚蠢的问题,但是可以从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
}
但我必须输入该令牌,我仍在尝试为当前用户生成它。
答案 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#等更高级别的语言更有意义。