Я хочу сделать атрибут [MyAuthorize(Role="R1")]
, чтобы "R1"
можно было сделать настраиваемым вместо жесткого кодирования на Controller / Action
.
Обычный подход к созданию [MyAuthorize(Role="R1")]
кажется
public class MyAuthorizeAttribute : AuthorizeAttribute
{
private readonly string[] _allowedRoles;
public MyAuthorizeAttribute(params string[] roles)
{
this._allowedRoles = roles;
}
protected override bool OnAuthorization(AuthorizationContext
authorizationContext)
{
bool authorize = false;
// Compare current user's Roles with "R1" to figure out if the
// Action / Controller can be executed
return authorize;
}
}
Но что, если такие роли, как "R1"
, могут быть изменены в любое время? то есть быть "R1"
в один день и называться "AssistantManager"
в другой день.
Приложение должно быть перекодировано, чтобы справиться с этим.
Я подумал о создании пользовательского атрибута [OnAuthorize]
, который читается (Действие/Контроллер, Роль) как key value pairs
из файла web.config
.
Eg:--
<add key="Controller1" value="Role1" />
<add key="Action2" value="Role2" />
а в атрибуте..
protected override bool OnAuthorization(AuthorizationContext
authorizationContext)
{
bool authorize = false;
// 1. Read all key values
// 2. determine Action / Controller the user is trying to go
// 3. Compare user's roles with those for Action / Controller
return authorize;
}
Я знаю об ограничениях <location .... />
в MVC согласно https://stackoverflow.com/a/11765196/807246
и не утверждаю этого, хотя читаю из web.config
Но что, если мы прочитаем (..и сохраним в сеансе??) всю конфигурацию, связанную с авторизацией, при первой загрузке приложения?
Любые изменения типа "R1" -> "AssistantManager"
;; "R2" -> "Manager"
должен просто требовать перезапуска приложения, вместо того, чтобы вносить изменения в код в контроллере/действии.
Я хочу знать, является ли это допустимым подходом или есть ли риски безопасности, даже с этим, и любые лучшие альтернативы.