Вы можете создать свой собственный атрибут, который наследуется от AuthorizeAttribute
, и переопределить метод OnAuthorize
, чтобы сделать то, что вам нужно.
Это должно помочь вам начать:
public class ArticleAuthorizeAttribute : AuthorizeAttribute
{
public enum ArticleAction
{
Read,
Create,
Update,
Delete
}
public ArticleAction Action { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
//do custom authorizization using Action and getting ArticleID
//from filterContext.HttpContext.Request.QueryString or
//filterContext.HttpContext.Request.Form
}
}
Использование будет выглядеть так:
[ArticleAuthorize(Action=ArticleAuthorizeAttribute.ArticleAction.Update)]
Редактировать: После более подробного изучения, похоже, что вы не можете передать this.articleID в атрибут. Однако у вас есть доступ к параметрам из filterContext.HttpContext.Request
через свойство QueryString
или свойство Form
, в зависимости от того, как вы передаете значения. Я обновил пример кода соответствующим образом.
Более полный пример можно найти здесь
Чтобы проверить авторизацию, используя роль пользователя и список пользователей, вы должны сделать что-то вроде этого:
var allowedUsers = new List<string>();
//populate allowedUsers from DB
If (User.IsInRole("Update") || allowedUsers.Contains(User.Identity.Name))
{
//authorized
}
В качестве альтернативы вы можете выполнить обе проверки непосредственно в БД в одном методе, чтобы не делать два вызова.