3

ユーザーパスワードを使用せずに、ユーザープリンシパル名(UPN)のみを使用してAlfrescoログインチケットを取得する機能を備えたDLLを作成しています。alfrescoRESTAPIサービス/wcserviceを呼び出しています。AlfrescoでNTLMを使用しています。

WindowsIdentityここで説明されているように、コンストラクターを使用してユーザーを偽装していますhttp://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity。チェックしたところ、ユーザーは適切に偽装されています(プロパティをチェックWindowsIdentity.GetCurrent().Nameしました)。

HttpWebRequestユーザーになりすました後、クレデンシャルを作成して設定しようとしますCredentialsCache.DefaultNetworkCredentials。エラーが発生します:

The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()

リクエストのクレデンシャルを設定するために使用new NetworkCredential("username", "P@ssw0rd")すると、Alfrescoログインチケット(HttpStatusCode.OK、200)を取得します。

ユーザーパスワードなしでAlfrescoログインチケットを取得する方法はありますか?

これが私が使用しているコードです:

private string GetTicket(string UPN) {
 WindowsIdentity identity = new WindowsIdentity(UPN);
 WindowsImpersonationContext context = null;

 try {
  context = identity.Impersonate();

  MakeWebRequest();
 }
 catch (Exception e) {
  return e.Message + Environment.NewLine + e.StackTrace;
 }
 finally {
  if (context != null) {
   context.Undo();
  }
 }
}

private string MakeWebRequest() {
 string URI = "http://alfrescoserver/alfresco/wcservice/mg/util/login";


 HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;

 request.CookieContainer = new CookieContainer(1);

 //request.Credentials = new NetworkCredential("username", "p@ssw0rd"); // It works with this
 request.Credentials = CredentialCache.DefaultNetworkCredentials;  // It doesn’t work with this
 //request.Credentials = CredentialCache.DefaultCredentials;    // It doesn’t work with this either

 try {
  using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) {
   StreamReader sr = new StreamReader(response.GetResponseStream());

   return sr.ReadToEnd();
  }
 }
 catch (Exception e) {
  return (e.Message + Environment.NewLine + e.StackTrace);
 }
}

Alfresco stdout.logからのレコードは次のとおりです(何らかの形で役立つ場合):

17:18:04,550  DEBUG [app.servlet.NTLMAuthenticationFilter] Processing request: /alfresco/wcservice/mg/util/login SID:7453F7BD4FD2E6A61AD40A31A37733A5
17:18:04,550  DEBUG [web.scripts.DeclarativeRegistry] Web Script index lookup for uri /mg/util/login took 0.526239ms
17:18:04,550  DEBUG [app.servlet.NTLMAuthenticationFilter] New NTLM auth request from 10.**.**.** (10.**.**.**:1229)
17:18:04,566  DEBUG [app.servlet.NTLMAuthenticationFilter] Processing request: /alfresco/wcservice/mg/util/login SID:7453F7BD4FD2E6A61AD40A31A37733A5
17:18:04,566  DEBUG [web.scripts.DeclarativeRegistry] Web Script index lookup for uri /mg/util/login took 0.400909ms
17:18:04,566  DEBUG [app.servlet.NTLMAuthenticationFilter] Received type1 [Type1:0xe20882b7,Domain:<NotSet>,Wks:<NotSet>]
17:18:04,566  DEBUG [app.servlet.NTLMAuthenticationFilter] Client domain null
17:18:04,675  DEBUG [app.servlet.NTLMAuthenticationFilter] Sending NTLM type2 to client - [Type2:0x80000283,Target:AlfrescoServerA,Ch:197e2631cc3f9e0a]
4

2 に答える 2

4

私は問題を解決しました!

ダブルホップの問題があったと思います。

これは、この問題を解決するために行わなければならなかったことです。

  1. DLLを実行するユーザーは、WindowsServer2003ドメインユーザーである必要があります
  2. DLLを使用するサービスは、それを実行するユーザー(DLLを実行するユーザー)にドメインコントローラーにサービスプリンシパル名を登録している必要があります
  3. DLLを実行するユーザーは、 アカウントが機密であり、ドメインコントローラーで選択されたオプションを委任できないようにする必要があります
  4. DLLを実行する ユーザーは、任意のサービスへの委任についてこのユーザーを信頼する(Kerberosのみ)か、ドメインコントローラーで選択された指定されたサービスのみへの委任についてこのユーザーを信頼する必要があります(ユーザーがWindows Server 2003機能ドメインにいる場合、このオプションはのみ使用可能です)このユーザーにサービスプリンシパル名を登録する場合)
  5. DLLを実行するユーザーは、TrustedToAuthForDelegationユーザーアカウント制御(UAC)をtrueに設定する必要があります
  6. DLLを使用するサービスを実行するコンピューターには、任意のサービスへの委任用にコンピューターを信頼する(Kerberosのみ)か、ドメインコントローラーで選択された指定されたサービスへの委任用にコンピューターを信頼するオプションが必要です。

このすべて(およびそれ以上)については、Microsoftのドキュメント「Kerberos委任のトラブルシューティング」で説明されています。を含む:

  • Active Directoryのチェックリスト、
  • クライアントアプリケーションのチェックリスト、
  • 中間層のチェックリスト、
  • バックエンドのチェックリスト

プラス

  • 一般的なシナリオの構成例。

TrustedToAuthForDelegationユーザーアカウント制御(UAC)の設定は、PowerShellでActiveDirectoryコマンドレットによってここで説明さています

ASP.NET2.0でのWindows認証の詳細を読むことができます。

もちろん、AlfrescoではKerberosログインを有効にする必要があります。

于 2011-01-20T15:25:04.747 に答える
1

Alfrescoでは不可能だと思います。この「非個人的な」ユーザーが存在する特別な認証サブシステムを使用する場合のみ。

'guest'ユーザーはすべてのサブシステム認証に対して横断的であるため、これを試してください。

request.Credentials = new NetworkCredential( "guest"、 "guest");

そしてURI、このようなもの:

string URI = "http:// alfrescoserver / alfresco / s / api/loginまたはあなたが提案するものなら何でも。

幸運を。パコ

于 2011-01-12T11:15:39.227 に答える