[英]How to get Alfresco login ticket without user password, but with impersonating user with user principal name (UPN)
我正在编写一个DLL,它具有在不使用用户密码的情况下获取Alfresco登录票证的功能,仅使用用户主体名称(UPN)。 我正在调用alfresco REST API服务/ wcservice 。 我在Alfresco使用NTLM。
我正在冒充使用WindowsIdentity
构造函数的用户,如http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity所述 。 我检查并正确模拟用户(我检查了WindowsIdentity.GetCurrent().Name
属性)。
在模仿用户之后,我尝试使用CredentialsCache.DefaultNetworkCredentials
制作HttpWebRequest
并设置其凭据。 我收到错误:
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]
我已经解决了这个问题!
我相信我们有一个双跳问题 。
这是解决这个问题所必须做的事情:
在Microsoft文档疑难解答Kerberos委派中解释了这一切(以及更多)。 它包含:
加
设置TrustedToAuthForDelegation用户帐户控制(UAC)是在PowerShell中通过此处说明的Active Directory cmdlet完成的。
您可以在ASP.NET 2.0中阅读有关Windows身份验证的更多信息。
当然,Alfresco必须启用Kerberos登录。
我认为Alfresco不可能。 只有当您使用特殊身份验证子系统时,才会存在此“非个人”用户。
试试这个,因为'guest'用户对所有子系统身份验证都是横向的。
request.Credentials = new NetworkCredential(“guest”,“guest”);
和URI,像这样:
string URI =“http:// alfrescoserver / alfresco / s / api / login或者你提出的任何建议。
祝好运。 帕科
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.