Авторизация пользователей веб-приложений на основе информации о пользователях, а также роли - PullRequest
1 голос
/ 26 октября 2010

Мне было интересно, сможет ли кто-нибудь помочь мне со следующим?

Мне нужны более сложные правила для авторизации в веб-приложении, чем просто роль, с которой я работаю нормально.Что-то вроде «Разрешить всем администраторам. Разрешить покупателям, при условии, что они имеют правильный идентификатор отдела и им разрешено просматривать учетные данные этого клиента».

Я использую собственную идентификационную информацию и пользовательскую учетную запись для хранения такой информации, какразрешено ли пользователю видеть всех клиентов или каких отдельных клиентов они могут видеть.Эта информация извлекается из базы данных и добавляется при создании удостоверения / принципала.

Я создал специальное разрешение, которое расширяет IPermission, ISecurityEncodable.В рамках этого я изменил функцию Demand () следующим образом:

public  void Demand()
    {
        this._identity = (UserIdentity)Thread.CurrentPrincipal.Identity;
        if (Thread.CurrentPrincipal.IsInRole("Admin")) { }
        else if ((Thread.CurrentPrincipal.IsInRole("Buyer")) && 
                 (this._identity.CanViewAllClients) &&
                 (this._identity.IsInDept(this._departmentID)) ) { }
        else if ((Thread.CurrentPrincipal.IsInRole("Buyer")) && 
                 (this._identity.CanViewClient(this._requestedClient)) &&
                 (this._identity.IsInDept(this._departmentID)) ) { }
        else { throw new SecurityException("Custom Permission Denied"); }  
    }

Затем я вызываю ее, когда хочу авторизоваться, используя

CustomPermission custperm = new CustomPermission(requestedClient, reqClientDept);
custperm.Demand();

. Это работает нормально, но, кажется,грязный, хакерский способ делать вещи.Тем более, что было бы неплохо использовать мои роли безопасности в качестве атрибута, например

[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public class...

Возможно, есть способ вызвать [CustomPrincipalPermission (SecurityAction.Demand, Authorized = true)] с пользовательской проверкой IsAuthorised?Это возможно?Что должно быть реализовано?

Я извиняюсь, если есть простое решение, которое я пропустил онлайн, но будьте уверены, я проверял уже несколько дней.

1 Ответ

0 голосов
/ 23 февраля 2011

Похоже, то, что вы хотите, является декларативным, а не программным требованием. Для этого вам нужно создать CustomPermissionAttribute на основе вашего CustomPermission.

Здесь приведен пример декларативного требования настраиваемого разрешения здесь и подробностей создания атрибута настраиваемого разрешения здесь .

...