在将用户权限基于特定帐户/角色以外的其他内容时,自定义用户授权的最佳方法是什么?

Bob*_*der 3 .net c# asp.net-mvc

我正在尝试编写一个ASP.NET MVC应用程序,其中用户权限基于点而不是硬编码角色本身.我已经尝试过研究授权和成员资格提供程序,但我找到的所有信息都指向基于角色的身份验证,而这种身份验证并不是我模型的真正部分.

在写这个问题时,我想知道我是否正在研究正确的事情.这会是一个自定义角色提供者吗?这样的事情存在吗?我突然想到,拥有一个自定义角色提供程序来检查用户的点以确定他们是否处于特定角色可能是最简单的方法,但我不知道我需要使用的关键字与ASP.NET MVC能够找到合适的信息.

实现这一目标的最佳方法是什么?

tva*_*son 5

我建议扩展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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用作

[PointAuthorize( PointsRequired = 50 )]
public ActionResult Comment( string comment )
{
}
Run Code Online (Sandbox Code Playgroud)

您可能希望进一步自定义它,以便失败点要求重定向到错误消息而不是登录页面.在这种情况下,您还必须覆盖OnAuthorization方法,并且可能确定用户的点级别是否太小,然后用您的错误视图替换AuthorizationContext上的结果.