ユーザーのパスワードなしでは屋外ログインチケットを取得する方法ですが、ユーザーのプリンシパル名(UPN)にユーザーになりすましています
-
08-10-2019 - |
質問
ユーザーのプリンシパル名(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]
解決
私は問題を解決しました!
私たちは持っていたと信じています ダブルホップの問題.
これは、この問題を解決するためにしなければならなかったことです。
- 私のDLLを実行するユーザーはそうでなければなりません Windows Server 2003ドメインユーザー
- 私のDLLを使用するサービスは登録されている必要があります サービスプリンシパル名 それを実行するユーザーを備えたドメインコントローラー(私のDLLを実行するユーザー)
- 私のDLLを実行しているユーザーはありませんアカウントは敏感であり、委任することはできません ドメインコントローラーで選択されたオプション
- 私のDLLを実行するユーザーは持っている必要がありますあらゆるサービスへの委任のためにこのユーザーを信頼してください(Kerberosのみ) また このユーザーは、指定されたサービスのみに代表団を信頼してください ドメインコントローラーで選択されたオプション(ユーザーがWindows Server 2003機能ドメインにある場合、このオプションは、このユーザーにサービスプリンシパル名を登録した場合にのみ使用できます)
- 私のDLLを実行するユーザーは持っている必要があります 信頼できる ユーザーアカウントコントロール(UAC)Trueに設定されています
- 私の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など。
幸運を。パコ