Вы попробовали getImageData метод?
var data = context.getImageData(x, y, 1, 1).data;
var rgb = [ data[0], data[1], data[2] ];
На мой взгляд, это слабость дизайна членства / ролей.
Я бы решил обойти это, например, чтобы иметь авторизацию на основе ролей на уровнях UI и BLL в распределенное n-уровневое приложение должно было бы предоставлять сервис на уровне BLL, который предоставляет соответствующие биты (GetRolesForUser и т. д.) и реализуется путем вызова RoleProvider на сервере.
Затем реализуйте настраиваемый RoleProvider на клиенте, который является реализуется путем вызова службы, предоставляемой BLL.
Таким образом, уровень пользовательского интерфейса и уровень BLL совместно используют один и тот же RoleProvider. Уровень пользовательского интерфейса может использовать сведения о ролях текущего пользователя для улучшения пользовательского интерфейса (например, скрытие / отключение элементов управления пользовательского интерфейса, соответствующих неавторизованным функциям), а BLL может гарантировать, что пользователи не могут выполнять бизнес-логика, для которой они не авторизованы.
Get your User object to implement the IPrincipal interface and throw that around the layers. Then you can still use the built in [Autorize] attribute.
Athough written over 3 years ago and about castle, this article may help. It starts getting into the IPrincipal stuff half way down.
HTHS
Charles
Отличный вопрос, я задал себе то же самое сегодня . Одна из моих идей (но я не совсем уверен, что это лучший вариант) - использовать интерфейс (например, IRoleProvider), который вы можете передать своему BLL для проверки доступа.
public static bool IsRoleEditor(User user, IRoleProvider rp)
{
return (rp.IsUserInRole(user,"ModifyRoles"));
}
С этим, вы по-прежнему подтверждаете свой доступ в BLL,
Ролевой доступ обычно не должен находиться в BLL. Доступ является обязанностью пользовательского интерфейса.
С учетом сказанного, используйте интерфейс IPrinciple, как указано на вышеприведенных плакатах. У вас есть доступ к IPrinciple на уровне потока.
Thread.CurrentPrincipal
Почему бы не передать роли в ваш BLL, чтобы у вас не было никакой зависимости от членства. Или используйте интерфейс, подобный предложенному Мартином Б.
Что произойдет в будущем, когда ваши заинтересованные стороны решат использовать другую форму аутентификации, и вы больше не будете работать с объектом Роль ?
] Пример:
IsRoleEditor(User user, string[] roles)
{
return roles.Contains("ModifyRoles");
}
Вы не упускаете из виду MVC. MVC естественным образом разбивается на уровни. Модель (DAL), контроллер (BLL), View (презентация). Они могут быть включены в разные проекты, если хотите, но поскольку у контроллера есть вся бизнес-логика - вам нужно только получить доступ к RoleProvider там.
Затем примените шаблоны, такие как репозиторий, шаблон и т. Д., Чтобы разделить дальше, если хотите.
Дэви
Вызов контроллера MVC «UI» неуместен. «C» в MVC является частью вашего BLL, даже если он ссылается на классы, которые вы позвонили бы в BLL. Однако ваш вопрос не в этом.
Думаю, я бы решил эту проблему, задав вопрос: «Существует ли реальное требование для 100% разделения вашего приложения« UI »и вашего« BLL »?». Если оба компонента имеют общую зависимость от поставщиков членов / ролей, пусть это будет так и приступайте к работе.
В случае, когда вы отключаете свой BLL и подключаете новый, возможно, имея общую зависимость от .NET провайдер - это то, с чем можно жить. Вы знаете, что это, вероятно, нормально, и ваше приложение может не развалиться.
Я думаю, что приведенный выше ответ Джо имеет большой смысл ...
Думаю, то, что вы делаете, нормально.
Авторизация и аутентификация должны находиться на уровне служб, который, возможно, передается в ваши контроллеры.
Если контроллер устанавливает принципала и личность, а затем вы используете это в контроллере с помощью атрибутов MVC, это звучит как хорошая идея.
Было бы неплохо скрыть вашего поставщика членства MVC за интерфейсом , таким образом вы можете поменять его на поставщика членства WinForms (например) и иметь возможность проводить модульное тестирование ваших контроллеров.