Каков наилучший способ настройки авторизации пользователей, когда пользовательские привилегии основаны не на определенных учетных записях / ролях? - PullRequest
3 голосов
/ 31 октября 2009

Я пытаюсь написать приложение ASP.NET MVC, в котором пользовательские привилегии основаны на точках, а не на жестко заданной роли как таковой. Я пытался исследовать поставщиков авторизации и членства, но вся информация, которую я нахожу, указывает на аутентификацию на основе ролей, которая на самом деле не является частью моей модели.

Во время написания этого вопроса мне интересно, исследую ли я даже правильные вещи. Это будет пользовательский поставщик ролей? Существует ли такая вещь? Внезапно мне пришло в голову, что наличие собственного поставщика ролей, который проверяет баллы пользователя, чтобы определить, играет ли он определенную роль или нет, может быть самым простым путем, но я понятия не имею о ключевых словах, которые мне нужно использовать по отношению к ASP.NET MVC для поиска нужной информации.

Как лучше всего достичь этой цели?

1 Ответ

5 голосов
/ 31 октября 2009

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

public class PointAuthorizeAttribute : AuthorizeAttribute
{
    public int PointsRequired { get; set; }

    protected override bool AuthorizeCore( HttpContextBase httpContext )
    {
         if (base.AuthorizeCore( httpContext ))
         {
             var name = httpContext.User.Identity.Name;
             using (var db = new SomeDataContext())
             {
                 var userPoints = db.Users
                                    .Where( u => u.UserName == name )
                                    .Select( u => u.Points )
                                    .SingleOrDefault();
             }
             return (userPoints >= PointsRequired);
         }
         return false;
    }
}

Используется как

[PointAuthorize( PointsRequired = 50 )]
public ActionResult Comment( string comment )
{
}

Возможно, вы захотите дополнительно настроить его так, чтобы при невыполнении требования по точкам перенаправлялось на сообщение об ошибке, а не на страницу входа. В этом случае вам также придется переопределить метод OnAuthorization и, возможно, определить там, является ли уровень точки пользователя слишком маленьким, а затем заменить результат в AuthorizationContext на представление ошибок.

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