2015-01-09 60 views
0

我是一个ASP.NET新手,并创建一个内部应用程序(将由组内的10个用户使用)。 其中一个目标是将用户添加到Active Directory组。出于审计目的,应用程序用户应该使用自己的凭据进行AD更改(而不是为此唯一目的而创建的通用标识)。该网站托管在Windows Server 2008 R2/IIS 7.0上,并且所有内容都位于企业域中。ASP.NET与活动目录:用户凭证

IIS设置:
应用程序池名称:UserAppMapping,集成,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 

`

问题

一切工作正常,但当在代码中遇到以下行时:

insGroupPri nipal.Members.Add(用户)
insGroupPrincipal.Save()

应用程序提示输入用户凭证。虽然我了解此功能中的代码正在Windows Identity“IIS APPPOOL \ UserAppMapping”的上下文中运行,但它会提示输入有权访问Active Directory的凭据。 是否有应用程序用户修改AD组(我假设用户可以直接在AD中修改组),而无需键入额外的凭据?

如果我从代码中删除“使用(HostingEnvironment.Impersonate())”,它会在遇到GroupPrincipal.FindByIdentity时立即失败。

web.config中设置有:

身份验证模式= “窗口”
身份冒充= “真”

在此先感谢。

回答

0

请执行以下操作。

  1. 确保IIS身份验证设置为Windows Auth = enabled,Anonymous = false。除了web.config之外,这是必需的。

第2步:您需要的帐户在AD中的权限高于ApplicationPoolIndentity。

  1. 您需要一个网络帐户才能执行AD工作。创建一个新的网络帐户,然后在IIS的应用程序池中将其从ApplicationPoolIndentity更改为自定义帐户。然后输入您的新AD帐户和密码。(我建议让AD帐号密码永不过期)
+0

IIS身份验证已设置为Windows身份验证和ASP.NET模拟。匿名设置为False。如果我创建一个新的网络帐户并设置为应用程序池标识,那么不应该该帐户执行AD中的所有写入操作吗?那么我将如何知道哪个应用程序用户实际进行了更改? – FromNY 2015-01-11 15:41:02