0

これはばかげた質問かもしれませんが、Active Directoryから現在ログインしているユーザーのGSSAPIトークンを取得することは可能ですか?

サーバーに接続する単純なライブラリがあります。ユーザー名、パスワード、ドメイン名、またはGSSトークン(base64)を渡すことができます。今のところ最初の方法は私にとってはうまくいきますが、ユーザーがパスワードを入力しなければならないのは面倒です。

GSSAPIとActiveDirectoryとの統合に関する情報が見つかりませんでした。

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
}

しかし、私はそのトークンを入力する必要があり、現在のユーザーのためにそれを生成しようとしています。

4

2 に答える 2

2

時間を無駄にしないでください。C#でP/InvokeでSSPIを使用します。

于 2012-12-05T16:48:17.777 に答える
0

Microsoftには、Managed C ++(C#から簡単に呼び出すことができます)でSSPIを使用する例があります:http://msdn.microsoft.com/en-us/library/ms973911.aspx

C#で書いてみませんか?アセンブリをC#とManagedC++で作成してみました。基本的なトレードオフをすぐに発見しました。SSPIのようなアンマネージコードをマネージ言語(C#など)で操作したいのか、それともC ++で記述し、マネージ拡張を使用して.NETの世界に接続したいのか。

SSPIには、複雑なパラメーターを持つ多くの関数があります。これには、多くのポインタ、(ネストされた)構造などが含まれます。アセンブリをC#で作成するということは、SSPI関数パラメーターのマネージバージョン(これらすべての複合型)を宣言し、アンマネージ関数に渡すときにそれらがメモリに適切に固定されていることを確認する必要があることを意味します。

マネージC++でアセンブリを作成するということは、ネイティブ環境でアンマネージ型を処理することを意味します。必ずしもピン留めについて心配する必要はなく、型を再宣言する必要もありません(適切なヘッダーファイルをプルするだけです)。

Microsoft.Samples.Security.SSPIを構築するとき、マネージC++で作業を行う方が簡単であることがわかりました。すべての複合型は管理されていない世界に保管されています。アンマネージAPIは、ネイティブC環境で処理されます。マネージC++は、アンマネージ/マネージの世界の間のギャップを埋める優れた方法を提供します。

マイレージは異なる場合があり、選択は使用されているAPIによって異なります。ただし、SSPIを使用すると、マネージ拡張はC#のような高級言語よりも理にかなっています。

于 2012-12-05T16:59:18.597 に答える