MVC 3 динамическая авторизация нескольких ролей и пользователей - PullRequest
19 голосов
/ 19 июня 2011

Я недавно начал разрабатывать для MVC 3, но у меня уже есть опыт работы с C # и ASP.NET. Итак, я начну с того, что я пытаюсь достичь. Я разработал небольшой сайт для размещения статей. Я реализовал на сайте управление членством на основе SQLServer. Теперь я хочу создать систему учетных данных, которая ограничивает и позволяет нужным пользователям создавать, удалять и обновлять статьи. Для этого есть одно простое решение: сделать это так:

[Authorize(Roles="Admin")]
    public ActionResult UpdateArticle(ArticleModel model, int articleid)
    {
        return View();
    }

Теперь это действительно просто. Я просто говорю, что только участники, которые находятся в роли «Администратор», могут обновлять статью. Но это только для статики. Поэтому я создал таблицу учетных данных в моей базе данных, которая в конце говорит мне, что «Статью 5 могут редактировать роли 1,2,3 и 4 и пользователи A, B & C». Все идет нормально. Но как мне реализовать это с помощью решения Authorize?

Я бы хотел сделать что-то вроде этого:

[Authorize(getAuthorizedusers("update",this.articleid))]

где getAuthorizedusers возвращает пользователей и роли, которым разрешено обновлять статью с использованием переданного ей articleid.

Итак, у меня есть (по крайней мере) две проблемы: -Получение метода Authorize для принятия нескольких пользователей и ролей. -Передача предоставленного articleid, который был отправлен в метод UpdateArticle, в метод getAuthorizedusers.

Ответы [ 3 ]

19 голосов
/ 19 июня 2011

Вы можете создать свой собственный атрибут, который наследуется от 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
        }

В качестве альтернативы вы можете выполнить обе проверки непосредственно в БД в одном методе, чтобы не делать два вызова.

2 голосов
/ 21 июня 2011

Я заработал, как хотел, когда переопределил метод AuthorizeCore и авторизовал так, как я хочу.

2 голосов
/ 19 июня 2011

Вот гораздо более простой способ сделать то же самое:

[Authorize]
public ActionResult UpdateArticle(ArticleModel model, int articleid)
{
    // if current user is an article editor
    return View();
    // else
    return View("Error");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...