ユーザーのパスワードなしでは屋外ログインチケットを取得する方法ですが、ユーザーのプリンシパル名(UPN)にユーザーになりすましています

StackOverflow https://stackoverflow.com/questions/4627797

質問

ユーザーのプリンシパル名(UPN)のみを使用して、ユーザーパスワードを使用せずにAlfrescoログインチケットを取得する機能を備えたDLLを作成しています。 Alfresco Rest APIサービスを呼んでいます /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]
役に立ちましたか?

解決

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

私たちは持っていたと信じています ダブルホップの問題.

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

  1. 私のDLLを実行するユーザーはそうでなければなりません Windows Server 2003ドメインユーザー
  2. 私のDLLを使用するサービスは登録されている必要があります サービスプリンシパル名 それを実行するユーザーを備えたドメインコントローラー(私のDLLを実行するユーザー)
  3. 私のDLLを実行しているユーザーはありませんアカウントは敏感であり、委任することはできません ドメインコントローラーで選択されたオプション
  4. 私のDLLを実行するユーザーは持っている必要がありますあらゆるサービスへの委任のためにこのユーザーを信頼してください(Kerberosのみ) また このユーザーは、指定されたサービスのみに代表団を信頼してください ドメインコントローラーで選択されたオプション(ユーザーがWindows Server 2003機能ドメインにある場合、このオプションは、このユーザーにサービスプリンシパル名を登録した場合にのみ使用できます)
  5. 私のDLLを実行するユーザーは持っている必要があります 信頼できる ユーザーアカウントコントロール(UAC)Trueに設定されています
  6. 私のDLLを使用しているサービスを実行するコンピューターが必要です あらゆるサービスへの委任のためのコンピューターを信頼する(Kerberosのみ) また 指定されたサービスのみに委任するためのコンピューターを信頼してください ドメインコントローラーで選択されたオプション

これはすべて(そしてそれ以上)をMicrosoftドキュメントで説明しています Kerberosの代表団のトラブルシューティング. 。を含む:

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

プラス

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

設定 信頼できる ユーザーアカウントコントロール(UAC)は、Active Directory cmdletが説明したPowerShellで行われます ここ.

詳細を読むことができます ASP.NET 2.0のWindows認証.

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

他のヒント

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

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

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

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

string uri = "http:// alfrescoserver/alfresco/s/api/loginなど。

幸運を。パコ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top