Мне было интересно, сможет ли кто-нибудь помочь мне со следующим?
Мне нужны более сложные правила для авторизации в веб-приложении, чем просто роль, с которой я работаю нормально.Что-то вроде «Разрешить всем администраторам. Разрешить покупателям, при условии, что они имеют правильный идентификатор отдела и им разрешено просматривать учетные данные этого клиента».
Я использую собственную идентификационную информацию и пользовательскую учетную запись для хранения такой информации, какразрешено ли пользователю видеть всех клиентов или каких отдельных клиентов они могут видеть.Эта информация извлекается из базы данных и добавляется при создании удостоверения / принципала.
Я создал специальное разрешение, которое расширяет 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?Это возможно?Что должно быть реализовано?
Я извиняюсь, если есть простое решение, которое я пропустил онлайн, но будьте уверены, я проверял уже несколько дней.