带有 Active Directory 的 ASP.NET:用户凭据
Posted
技术标签:
【中文标题】带有 Active Directory 的 ASP.NET:用户凭据【英文标题】:ASP.NET with Active Directory: User Credentials 【发布时间】:2015-01-09 21:06:18 【问题描述】:我是 ASP.NET 新手,正在创建一个内部应用程序(将由组内的 10 个用户使用)。 目标之一是将用户添加到 Active Directory 组。出于审计目的,应用程序用户应使用自己的凭据(而不是为此唯一目的创建的通用 ID)进行 AD 更改。该网站托管在 Windows Server 2008 R2/IIS 7.0 上,一切都在企业域中。
IIS 设置: 应用程序池名称:UserAppMapping、Integrated、ApplicationPoolIdentity
身份验证:仅启用 ASP.NET 模拟和 Windows 身份验证。
VB.NET 代码(我已删除所有错误检查,以便查看实际错误):
Public Sub AddUserToGroup(userId As String, groupName As String, Optional GroupDN As String = "")
Using (HostingEnvironment.Impersonate())
Dim domainName As String = "DOM"
Dim ou = [String].Format(CultureInfo.InvariantCulture, "dc=0,dc=myorg,dc=com", domainName)
Dim domain = [String].Format(CultureInfo.InvariantCulture, "0.myorg.com", domainName)
Using insPrincipalContext = New PrincipalContext(ContextType.Domain, domain, ou)
If insPrincipalContext IsNot Nothing Then
Dim insGroupPrincipal As GroupPrincipal = GroupPrincipal.FindByIdentity(insPrincipalContext, System.DirectoryServices.AccountManagement.IdentityType.Name, groupName)
Dim user As UserPrincipal = UserPrincipal.FindByIdentity(insPrincipalContext, userId)
If insGroupPrincipal IsNot Nothing Then
'add user to group
If user.IsMemberOf(insGroupPrincipal) Then
LabelErr.Text = userId + " is already part of " + groupName
Else
insGroupPrincipal.Members.Add(user)
insGroupPrincipal.Save()
Label1.Text = "User added successfully"
End If
Else
Label1.Text = "Cannot retrieve information about " + groupName + " from Active Directory"
End If
Else
Label1.Text = "Principal Context is Null"
End If
insPrincipalContext.Dispose()
End Using
End Using
End Sub
`
问题:
一切正常,但在代码中遇到以下行时:
insGroupPrincipal.Members.Add(user) insGroupPrincipal.Save()
应用程序提示输入用户凭据。虽然我了解此函数中的代码在 Windows 身份“IIS APPPOOL\UserAppMapping”的上下文中运行,但它会提示输入可以访问 Active Directory 的凭据。 应用用户有没有办法修改 AD 组(我假设用户可以直接在 AD 中修改组)无需输入额外的凭据?
如果我从代码中删除“Using (HostingEnvironment.Impersonate())”,当遇到 GroupPrincipal.FindByIdentity 时它会立即失败。
web.config 设置为:
身份验证模式="Windows" 身份模拟=“真”
提前致谢。
【问题讨论】:
【参考方案1】:执行以下操作。
-
确保将 IIS 身份验证设置为 Windows Auth=enabled,Anonymous=false。除了 web.config 之外,这也是必需的。
第 2 步:您需要一个帐户在 AD 中的权限高于 ApplicationPoolIndentity。
-
您需要一个网络帐户来执行 AD 工作。创建一个新的网络帐户,然后在 IIS 的应用程序池中将其从 ApplicationPoolIndentity 更改为自定义帐户。然后输入您的新 AD 帐户和密码。 (我建议让 AD 帐户密码永不过期)
【讨论】:
IIS 身份验证已设置为 Windows 身份验证和 ASP.NET 模拟。匿名设置为 False。如果我创建一个新的网络帐户并设置应用程序池身份,该帐户不应该在 AD 中执行所有写入操作吗?那么我如何知道哪个应用用户实际进行了更改? 找到解决方案了吗?以上是关于带有 Active Directory 的 ASP.NET:用户凭据的主要内容,如果未能解决你的问题,请参考以下文章
利用 Active Directory 的 REST API 授权方法
没有密码的 ASP.Net Core 中的 Active Directory 授权
Azure Active Directory RBAC 不返回承载令牌中的角色