У меня есть приложение asp. net webforms, настроенное для аутентификации форм с использованием ActiveDirectoryMembershipProvider:
<authorization>
<deny users="?" />
<allow roles="MyGroup"/>
<deny users="*"/>
</authorization>
<membership defaultProvider="ActiveDirectoryMembershipProvider">
<providers>
<clear />
<add name="ActiveDirectoryMembershipProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider"
connectionStringName="ADAuth"
attributeMapUsername="sAMAccountName" />
</providers>
</membership>
Для своей страницы входа я использую asp: Контроль входа в систему:
<asp:Login ID="Login1" runat="server" RenderOuterTable="false" RememberMeSet="false">
<LayoutTemplate>
...
</LayoutTemplate>
</asp:Login>
Поскольку я хочу ограничить пользователей, входящих в указанную c группу Active Directory, я создаю RoleProvider, который может проверять членство в группе AD. Я создал поставщика ролей и настроил приложение для его использования:
<roleManager enabled="true" defaultProvider="ActiveDirectoryRoleProvider">
<providers>
<clear/>
<add name="ActiveDirectoryRoleProvider"
type="My.ActiveDirectoryRoleProvider"
connectionStringName="ADAuth"/>
</providers>
</roleManager>
Веб-приложение корректно ограничивает доступ. Однако это происходит путем вызова функции GetRolesForUser (string username) объекта RoleProvider. И это может сделать этот вызов 3 или 4 раза для каждой страницы.
Поэтому мой вопрос заключается в том, почему фреймворк вызывает GetRolesForUser, когда провайдер также предоставляет метод IsUserInRole, который может быть менее дорогим, потому что GetRulesForUser должен вернуть все роли, которые есть у пользователя, против проверки одной роли и возврата true / false? И зачем это нужно делать несколько раз?