Реклама:

На мой взгляд, пи одна из этих возможностей не обеспечивает преимуществ работы непосредственно с WindowsPrincipal. Метод GetRoks проще, нежели метод, предусматривающий извлечение групп Windows из маркера напрямую, однако ненамного. Я уже показывал этот код в действии. Следующая простая справочная процедура позволяет считывать группы из Windowsldentity напрямую, без использования RolePrincipal.

stringf] GetWinOowsGroups(Windowsldentity id) f

List<string> groups = new List<string>(); IdentityReferenceCollection ire = id.Groups.Translate(typeof(NTAccount));

foreach (NTAccount acc in ire) {

groups.Ad0(acc.Value);

I

return groups.ToArray();

I

Служба Role Manager также предоставляет возможность производить кэширование. Маркер Windows содержит только идентификаторы защиты (Security Identifier, SID) групп, членом которых является пользователь. Для преобразования SID в читабельную строку необходимо подключить контроллер домена. Это происходит при обращении к методу Context.User.IsInRole(Vomain\\SomeGroup") в WindowsPrincipal,

Если вы впервые вызываете из RolePrincipal метод IsInRole при включенном кэшировании Role Manager, метод GetRolesForllser из TokenRoleProvider транслирует все SID из маркера в соответствующие имена для последующего кэширования. При втором вызове IsInRole используется кэшированная версия групп. Насколько серьезной операцией будет первый вызов, зависит от количества групп Windows, членом которых является пользователь, и сложности домена. К тому же следует помнить, что в таких сложных средах количество ролей может превысить максимум, который помещается в файл cookie. В таком случае вы не получите никаких выгод от использования Role Manager.

Мало кому известно, что Local Security Authority (LSA) кэширует также результаты сопоставления SID именам. Это означает, что при повторном вызове IsInRole для той же группы Windows вместо обмена данными через сеть будет наблюдаться совсем иной процесс. Таким образом, совершенно очевидно, что производительность при передаче ролей в cookie и обратно гораздо выше, чем при кэшировании LSA.

Еще одна особенность провайдера ролей маркера состоит в том, что он извлекает из группы компьютерные имена. Однако это делается лишь при наличии локальных групп машин, а не доменных групп или таких специальных, как NT Authority BUILTIN. Вы легко можете проанализировать поведение провайдера путем сравнения выходных данных метода RolePrincipal.GetRoles() для группы, хранящейся в маркере.

Сравнение RolePrincipal и групп маркера

<%# Page Language="C#" %>

<%3 Import Namespace="System.Security.Principal" %> <%@ Import Namespace-'System.Collections.Generic" %>

<!00CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitionai//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitionai.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e) {

// Извлечение ролей RolePrincipal string[] rpRoles = getRolePriricipalflolest);

// Извлечение ролей маркера string[] irRoles = getTokenRoles()i


⇐ Предыдущая страница| |Следующая страница ⇒