我有一个与Windows服务对话的Web应用程序(在IIS中托管).Windows服务使用ASP.Net MVC Web API(自托管),因此可以使用JSON通过http进行通信.Web应用程序配置为进行模拟,其想法是向Web应用程序发出请求的用户应该是Web应用程序用来向服务发出请求的用户.结构如下所示:

(以红色突出显示的用户是以下示例中引用的用户.)
Web应用程序使用以下命令向Windows服务发出请求HttpClient:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Run Code Online (Sandbox Code Playgroud)
这会向Windows服务发出请求,但不会正确传递凭据(服务将用户报告为IIS APPPOOL\ASP.NET 4.0).这不是我想要发生的事情.
如果我将上述代码更改为使用WebClient,则会正确传递用户的凭据:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Run Code Online (Sandbox Code Playgroud)
使用上述代码,服务将用户报告为向Web应用程序发出请求的用户.
我执行错误HttpClient导致它无法正确传递凭据(或者它是一个错误HttpClient),我做错了什么?
我想使用HttpClient它的原因是它有一个与s兼容的异步API Task,而WebClientasyc API需要用事件处理.
我正在创建一个内部网asp.net mvc应用程序,公司中的每个人都应该可以访问它.我需要运行模拟数据库访问的网站等,但我想知道每个用户是谁.
当我看着Page.User.Identity.Name它的空白时.即使网站正在模拟运行,是否可以获取用户的Windows帐户名称?
编辑: 这里有更多信息.我在IIS 6中有一个运行匿名访问的站点.该站点在可以访问数据库的系统帐户下运行(因为所有员工都无权访问数据库).
我的web.config有<authentication mode="Windows" />和<identity impersonate="true"/>
我的目标是用户不必登录 - 他们登录我们网络的事实(以及该网站不在外部IP上的事实)是足够的身份验证.我想知道用户是谁以跟踪他们所做的更改等.
这个问题就是我要问的问题,但答案并未提供有关_token如何派生的详细信息.它似乎只是使用WindowsIdentity.GetCurrent().Token所以没有冒充发生.
我可以在.NET中模拟其他Active Directory域上的用户吗?
接下来的问题有相互矛盾的答案,接受的答案是"我开始怀疑我的问题出在其他地方." 没用.
下一个问题似乎暗示它是不可能的,但它涉及2个域,所以我不确定它是否相关.
我真正的问题是:
我到目前为止尝试的是,使用http://msdn.microsoft.com/en-us/library/chf6fbt4%28v=VS.80%29.aspx中的代码
bool returnValue = LogonUser(user, domain, password,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
ref tokenHandle);
// after this point, returnValue = false
Run Code Online (Sandbox Code Playgroud)
Win32错误是
登录失败:未知的用户名或密码错误
有没有办法告诉我的代码以不同的用户身份运行?
我通过PInvoke调用NetUserSetInfo,我需要将其称为不同的用户.有没有办法做到这一点?
我在Web应用程序中调用Web服务时遇到了一些麻烦,我希望有人能够提供帮助.据我所知,这似乎与Kerberos 双跳问题有关.但是,如果是,我不知道该怎么做才能真正解决问题.为了使事情更难,我没有适当的权限来更改Active Directory帐户,因此我需要知道在请求更改时要求的内容.在我的情况下,我需要将凭据(集成Windows身份验证)从Web应用程序传递到后端Web服务,以便Web服务在适当的用户上下文中运行.
这是我的确切问题:
这有效

这不起作用

在只有工作方案和非工作方案之间的区别是,工作方案正在运行在本地主机上的应用程序(无论是开发人员的电脑或有问题的服务器上)和非工作实例另一台机器上运行.两种方案之间的代码完全相同.
我试过的
setspn -a http/server1 DOMAIN\accountusing(...)并将Web服务调用作为应用程序池帐户执行.这按预期工作.有没有人知道我可以做些什么来解决这个问题?
作为LocalSystem运行的C#程序如何临时模拟另一个用户的登录标识?粗略地说,我有一个Windows服务,我想作为LocalSystem运行,但有时模仿用户XYZ(当使用Windows集成安全性连接到数据库时).
最重要的是:有没有办法在不知道其他用户密码的情况下做到这一点?
注意:如果密码是强制性的,则建议安全地存储密码(c#和/或vbscript).
我有一个ASP.NET站点,必须使用表单身份验证而不是Windows身份验证来访问ActiveDirectoryMembershipProvider.该站点必须使用表单,因为它们需要设计的输入表单,而不是Windows身份验证使用的浏览器身份验证弹出窗口.
该站点需要模拟通过Active Directory登录的用户访问用户特定文件.
但是,WindowsIdentity.GetCurrent()由于是不一样的HttpContext.Current.User.Identity,虽然我的web.config包括:
<authentication mode="Forms">
<forms loginUrl="login.aspx" timeout="480"/>
</authentication>
<identity impersonate="true" />
Run Code Online (Sandbox Code Playgroud)
我无法使用LoginUser(),WindowsIdentity.Impersonate()因为我需要冒充AD用户来获取他们的特定权限,而我不知道用户的密码,因为Forms负责登录.
是否可以从login.aspx.cs获取System.Web.UI.WebControls.Login.Password,然后将LoginUser()令牌保存在会话变量中以供WindowsIdentity.Impersonate()日后使用?或者可能采用更安全的方法冒充正确的方法?
我很困惑为什么表单身份验证不能自动 <identity impersonate="true" />
我已阅读此http://msdn.microsoft.com/en-us/library/ms998351.aspx但它使用Windows身份验证.
asp.net impersonation forms-authentication active-directory windows-authentication
我impersonate在Asp.net 4.0网站的web.config中使用标签.
下面是我的Web.Config代码:
<system.web>
<authentication mode="Windows">
<identity impersonate="true"
userName="Administrator"
password="LALLA$26526"/>
</authentication>
</system.web>
Run Code Online (Sandbox Code Playgroud)
当我在Visual Studio中运行应用程序时,我收到此错误:
Parser Error Message: Unrecognized element 'identity'.
Run Code Online (Sandbox Code Playgroud)
来源错误:
Line 50: <system.web>
Line 51: <authentication mode="Windows">
Line 52: <identity impersonate="true"
Line 53: userName="Administrator"
Line 54: password="LALLA$26526"/>
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
我在Intranet上有一个MVC Web应用程序,希望能够在我们的FTP服务器上创建文件以发送给外部合作伙伴.
模拟代码使用WindowsImpersonationContext.
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
StreamWriter sw = System.IO.File.CreateText("PathOnFTPServer");
sw.Write("data");
impersonationContext.Undo();
Run Code Online (Sandbox Code Playgroud)
这是发生了什么以及我的问题的原因:
预先假冒
User.Identity.Name:[我的Windows凭据]
System.Security.Principal.WindowsIdentity.GetCurrent().名称:NT AUTHORITY\NETWORK SERVICE
发布模仿
User.Identity:[我的Windows凭据]
GetCurrent.Name:[我的窗口凭据]
模仿撤消
User.Identity:[我的Windows凭据]
GetCurrent.Name:NT AUTHORITY\NETWORK SERVICE
因此,在我冒充之前,当前用户是系统帐户,但在模仿之后,它正在使用我的Windows域帐户,该帐户有权在FTP服务器上创建文本文件.该代码使用visual studio Web服务器在本地工作,但在我在测试服务器上的IIS上部署时则不行.
我收到拒绝访问错误.正确的用户被模拟时出现错误的原因是什么?
impersonation ×10
c# ×6
asp.net ×3
.net ×2
asp.net-mvc ×2
c#-2.0 ×1
kerberos ×1
wcf ×1
web-config ×1
windows ×1
winforms ×1