Установить доступ к элементам раскрывающегося списка на основе группы Active Directory пользователя - PullRequest
1 голос
/ 20 апреля 2011

Справочная информация. У меня есть приложение webForm, которое регистрирует пользователя в базе данных на основе информации, предоставленной веб-службой, автоматически генерирует случайный пароль и имя пользователя и отправляет пользователю по электронной почте ссылку для принятия приложения на основе выбранная маркетинговая компания.

Вопросы:

  • Как получить, чтобы только зарегистрированные в данный момент группы пользователей отображались в MarketingCo_DropDownList

Каждый пользователь, которому разрешен доступ к системе, будет иметь членство как минимум в одной из маркетинговых групп, как определено в web.config. Например, пользователь, который в настоящее время вошел в систему и принадлежит к группе BIG в расположении "alg \ ACOMP_user_BIG", сможет видеть только BIG в раскрывающемся списке Маркетинговой компании. Пользователь, который в настоящее время вошел в систему и принадлежит к группе NIS, расположенной в «alg \ ACOMP_user_NIS», сможет видеть только NIS в раскрывающемся списке Маркетинговой компании.

Вот скриншот внешнего интерфейса: web app screenshot

Вот мое лучшее предположение (находится в методе Private Sub GetMarketingCompanies () в default.aspx.vb):

    If InStr(WindowsIdentity.GetCurrent().Groups = "AMG", item.MarketingCompanyShort = "AMG", CompareMethod.Text) Then
            marketingCo.Items.Add(String.Format("{0} | {1}", item.MarketingCompanyShort, item.MarketingCompanyName))

            For Each item In ac1
                 marketingCo.Items.Add(String.Format("{0} | {1}", item.MarketingCompanyShort, item.MarketingCompanyName))
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

Я исключаю код из Учебное пособие по аутентификации Windows в Wrox , но оно недостаточно полно для того, что я пытаюсь сделать.

Файл Web.config (отображается только соответствующий код):

 <authentication mode="Windows"/>
   <authorization>            
    <allow users="alg\bmccarthy, alg\phoward" />               
    <allow roles="alg\ACOMP_user_Admin" />
    <allow roles="alg\ACOMP_user_AMG" />
    <allow roles="alg\ACOMP_user_BIG" />
    <allow roles="alg\ACOMP_user_NIS" />
    <allow roles="alg\ACOMP_user_GLA" />
    <allow roles="alg\ACOMP_user_PIP" />
    <allow roles="alg\ACOMP_user_PSM" />
    <allow roles="alg\ACOMP_user_PAM" />
    <allow roles="alg\ACOMP_user_ANN" />
    <allow roles="alg\ACOMP_user_AAM" />
    <allow roles="alg\ACOMP_user_MWM" /> 
    <allow roles="alg\ACOMP_user_GIM" />
    <deny users="*" />        
</authorization> 
   <bindings>
   <basicHttpBinding>
    <binding name="BasicHttpBinding_IAcompService" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <client>
  <endpoint address="http://172.17.1.40/aCompService.svc" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IAcompService" contract="aComp_ServiceReference.IAcompService"
    name="BasicHttpBinding_IAcompService" />
  </client>
 </system.serviceModel>

код default.aspx.vb с методами GetMarketingCompanies () и Page_Load (), где приложение извлекает MarketingCompanies из веб-службы и загружает его в раскрывающийся список через массив:

Private Sub GetMarketingCompanies()
    Try
        Dim ac1 As Array
        ac1 = proxy.GetMarketingCompanyNames("acompUser", "acompPass!")


        ' If InStr(WindowsIdentity.GetCurrent().Groups = "AMG", item.MarketingCompanyShort = "AMG", CompareMethod.Text) Then
        '  marketingCo.Items.Add(String.Format("{0} | {1}", item.MarketingCompanyShort, item.MarketingCompanyName))

        ' if current user role="alg\ACOMP_user_BIG" display BIG MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_NIS" display NIS MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_GLA" display GLA MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_PIP" display PIP MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_PSM" display PSM MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_PAM" display PAM MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_ANN" display ANN MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_AAM" display AAM MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_MWM" display MWM MarketingCo.Item '
        ' if current user role="alg\ACOMP_user_GIM" display GIM MarketingCo.Item '

        ' if current user = alg\ACOMP_user_Admin display all marketing companies in drop down list '
        For Each item In ac1
            marketingCo.Items.Add(String.Format("{0} | {1}", item.MarketingCompanyShort, item.MarketingCompanyName))
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load, Me.Load, Me.Load
    If Not lbCarriers.Items.Count > 0 Then
        GetCarriers()
        GetMarketingCompanies()
    End If
End Sub

Код Default.aspx, в котором определен раскрывающийся список marketingCo:

<table>
    <tr>
        <td class="style3">
            Marketing Co (auto-populated):
        </td>
        <td bgcolor="#ffffff" class="style8">
            <asp:DropDownList ID="marketingCo" runat="server" Height="23px" 
                Width="250px">
            </asp:DropDownList>
        </td>
    </tr>
        <td bgcolor="#ffffff" class="style6">
            <asp:Button ID="Send_Button" runat="server"  Text="Send Invitation" />
        </td>
    </tr>
</table>

Веб-служба возвращает массив строк с MarketingCompanyShort и MarketingCompanyName, которые добавляются в качестве элементов в раскрывающийся список. Код XSD-файла веб-службы:

<xs:element name="ArrayOfMarketingCompany" type="tns:ArrayOfMarketingCompany" nillable="true"/>
<xs:complexType name="MarketingCompany">
    <xs:sequence>
        <xs:element name="MarketingCompanyId" type="xs:int" minOccurs="0"/>
        <xs:element name="MarketingCompanyName" type="xs:string" nillable="true" minOccurs="0"/>
        <xs:element name="MarketingCompanyShort" type="xs:string" nillable="true" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

Спасибо за внимание!

Если у вас есть полезные ссылки или предложения, я проголосую за вас!

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

Я не уверен, что я полностью следую;Вы сопоставляете название каждой группы с конкретной маркетинговой компанией?Так как эта ссылка не сохраняется в Active Directory в любом месте, просто путем сопоставления текста каждого из них?

Если это так, я думаю, вы просто хотите проверить, какие группы возвращаются окнами itentitfy.Так что-то вроде этого?

For Each UserGroup in WindowsIdentity.GetCurrent().Groups
  If UserGroup.Value = "AMG" Then
    Dim Company= ac1.Cast(Of [TypeOfItemHere]).Where(Function(ac) ac.MarketingCompanyShort = "AMG").FirstOrDefault
    If Company IsNot Nothing Then
      marketingCo.Items.Add(String.Format("{0} | {1}", Company.MarketingCompanyShort, Company.MarketingCompanyName))
    End If
  End If
Next

... И так далее для других групп.При этом, вероятно, было бы лучше передать WindowsIdentitiy.GetCurrent (). Groups вместо этого в службу и выполнить там фильтрацию.

0 голосов
/ 28 апреля 2011

IdentityReference.Value возвращает SID текущего пользователя (например, S-1-5-32-544), а не имя группы (например, Acomp_user_BIG).

Вам необходимо использовать IdentityReference.Translate для преобразования идентификаторов безопасности (SID), которые WindowsIdentiy.Groups возвращает в NTAccounts

Вот код, который выведет все имена групп, к которым принадлежит текущий пользователь:

Public ReadOnly Property Groups As IdentityReferenceCollection
    Get
        Dim identityReferenceCollection As IdentityReferenceCollection
        Dim identityReference As IdentityReference
        identityReferenceCollection = WindowsIdentity.GetCurrent().Groups
        Dim strGroupName As String
        Dim mcisloaded As Boolean

        ' Translate the current user's active directory groups 
        For Each identityReference In identityReferenceCollection
            Dim mktGroup As IdentityReference = identityReference.Translate(GetType(NTAccount))
            ' MsgBox(mktGroup.Value)

            strGroupName = mktGroup.Value.ToString
         Next    

    End Get
End Property
...