Я бы предположил, что пользовательский атрибут авторизации, который расширяет 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 на представление ошибок.