带有 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:用户凭据的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Active Directory 自动登录

利用 Active Directory 的 REST API 授权方法

没有密码的 ASP.Net Core 中的 Active Directory 授权

Azure Active Directory RBAC 不返回承载令牌中的角色

ASP.NET 表单身份验证和 Active Directory 模拟

如何在 Active Directory 中获取用户的组? (c#, asp.net)