在 C#、asp.net、windows 身份中模拟
Posted
技术标签:
【中文标题】在 C#、asp.net、windows 身份中模拟【英文标题】:Impersonating in C#, asp.net, windows identity 【发布时间】:2016-04-21 07:40:25 【问题描述】:所以我正在尝试开发一个 Web 应用程序(c#,asp.net 4.5),它使用 Windows 身份和模拟连接到 TFS(团队基础服务器)并检索一些元素(工作项、任务等)。问题是模拟仅适用于运行应用程序的服务器,仅适用于我的身份。每当其他人尝试连接时,他们的访问被拒绝,应用程序崩溃一个未经授权的错误“TF30063:您无权访问[服务器地址]”。当然,其他人是经过授权的,因为他们可以直接访问 TFS(但不是通过我的应用程序),其中一些人是管理员。
返回错误的那段代码就是这个
protected TfsTeamProjectCollection TeamProjectCollection
get
if (tpc == null)
// I HAVE ALSO TRIED THIS COMMENTED OUT PART, TOO. Still doesn't work.
// using (WindowsIdentity.GetCurrent().Impersonate())
//
// tpc = new TfsTeamProjectCollection(new Uri(ConnectionString));
//
var identityDescriptor = Microsoft.TeamFoundation.Framework.Client.IdentityHelper.CreateDescriptorFromSid(WindowsIdentity.GetCurrent().User);
tpc = new TfsTeamProjectCollection(new Uri(ConnectionString), identityDescriptor);
return tpc;
有没有其他人遇到过这种情况?我花了几天时间研究网络,但没有找到有效的答案。希望大家能帮忙! 其他提及:在 web.config 中我设置了“identity impersonate = true”,在 iis 中我启用了 asp.net 模拟和 Windows 身份验证。所有其他身份验证选项都被禁用。
【问题讨论】:
我认为您需要使用HttpContext.Current.User.Identity
而不是WindowsIdentity.GetCurrent()
。
不,抱歉。我希望它是那么简单。您不能将 httpcontext.cu... 传递给描述符。它接受一个必须是 sid 的参数,因此它不是有效类型。刚试过这个。还是谢谢。
我没有提供正确的答案,因为我不确定细节。但是,我很确定 WindowsIdentity.GetCurrent()
是 IIS 工作进程使用的身份,它是一个服务帐户,而不是您在访问 TFS 时想要使用的身份。 HttpContext.Current.User.Identity
为您提供当前用户(浏览器中的用户)的身份,您需要将其转换为 TFS 以某种方式使用的所需形式。如果您需要 SID 并且只有 DOMAIN\USER
这样的用户名,则需要将该用户名映射到代码中的 SID。
【参考方案1】:
我正在使用这段代码在 WCF 服务中进行模拟:
/// <summary>
/// Impersonation - Creates new instance of TfsTeamProjectCollection object using a different user;
/// </summary>
/// <param name="serverUri">Tfs server uri you want to connect using Impersonation</param>
/// <param name="userToImpersonate">Account name of the user you want to Impersonate</param>
private void Impersonation(Uri serverUri, string userToImpersonate)
try
eventLog1.WriteEntry("Start Impersonation");
// Read out the identity of the user we want to impersonate
TeamFoundationIdentity identity = ims.ReadIdentity(IdentitySearchFactor.AccountName,
userToImpersonate,
MembershipQuery.None,
ReadIdentityOptions.None);
eventLog1.WriteEntry(identity.DisplayName);
this.impersonatedTFSUser = new TfsTeamProjectCollection(serverUri, identity.Descriptor);
eventLog1.WriteEntry(impersonatedTFSUser.Name);
eventLog1.WriteEntry("End Impersonation");
catch (Exception ex)
throw ex;
【讨论】:
【参考方案2】:在一些帮助下解决了这个问题。所以事实是,如果我使用 TFS 模拟,应用程序池需要与有权访问 TFS 的用户一起运行,仅此而已。我禁用了 asp.net 模拟,只启用了 Windows Auth。我还将应用程序池高级设置中的“身份”更改为我的 TFS 用户。 现在还有另一个问题。使用 Web 应用程序的任何人都只能看到他和我的用户都有权访问的项目。此外,在保存工作项时,TFS 使用应用程序池标识(在本例中为我的用户)自动完成“创建者”字段,并使用运行应用程序的用户自动完成“上次修改”字段。这不是我想要的工作方式,所以我要做更多的研究。
【讨论】:
以上是关于在 C#、asp.net、windows 身份中模拟的主要内容,如果未能解决你的问题,请参考以下文章
C# ASP.NET;获取登录用户的 NetworkCredential 对象?
ASP.NET 表单身份验证和 Active Directory 模拟
SQL 数据库驱动的 C# 和 ASP.Net 基于角色的身份验证控制
如何在 asp.net C# 中使用启用两因素身份验证的 office365 电子邮件帐户发送电子邮件?