0

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

我有一个连接到服务器的简单库。我可以传递用户名、密码和域名或 GSS 令牌(base64)。目前第一种方法对我有用,但用户必须输入密码让他们很恼火。

我找不到任何关于 GSSAPI 的信息以及它与 Active Directory 的集成。

在 C# 中可能吗?

基于@Harvey Kwok 评论的更多信息: Library is called Altair COMand it is used for document management

以下是有关使用 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
}

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

4

2 回答 2

2

不要浪费你的时间。在 C# 中将 SSPI 与 P/Invoke 结合使用。

于 2012-12-05T16:48:17.777 回答
0

微软在这里有一个在托管 C++ 中使用 SSPI 的示例(然后很容易从 C# 调用):http: //msdn.microsoft.com/en-us/library/ms973911.aspx

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

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

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

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

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

于 2012-12-05T16:59:18.597 回答