MVC3应用程序中的只读用户权限,且更改最少

tra*_*max 5 c# architecture filter readonly asp.net-mvc-3

我有一个为ASP.Net MVC3应用程序创建只读用户的任务.即他们可以登录,查看所有数据,但无法更新任何数据.

我已经阅读了很多认证文章/框架,如下所示:在ASP.Net MVC中实现安全的ASP.NET MVC应用程序,Fluent安全配置创建动作过滤器(以及其他一些,我已经丢失了链接) .

大多数方法的问题是它们需要对域/应用程序进行重大更改.我只有一天时间来实现这个功能.

我们有大约一百个控制器,每个控制器平均有4个动作(主要是CRUD操作),并且通过它们中的每一个都是不可能的.此外,很容易忘记在新代码上添加属性 - 引入错误.

到目前为止,我已经提出了全局过滤器,它拒绝所有基于POST的操作和称为"创建"的控制器操作为只读用户:

public class ReadOnlyFilter : IActionFilter 
{

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var currentUser = HttpContext.Current.User;
        if (currentUser == null || !currentUser.Identity.IsAuthenticated)
            return; // user is not logged in yet


        if (!currentUser.IsInRole("Readonly")) 
            return; // user is not read-only. Nothing to see here, move on!

        // Presume User is read-only from now on.


        // if action is of type post - deny
        if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST")
        {
            filterContext.HttpContext.Response.Redirect("~/ReadOnlyAccess");
        }

        // if action is "Create" - deny access
        if (filterContext.ActionDescriptor.ActionName == "Create")
        {
            filterContext.HttpContext.Response.Redirect("~/ReadOnlyAccess");
        }

        // if action is edit - check if Details action exits -> redirect to it.
        //TODO get this done ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        return;
    }


    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // blah! have to have this here for IActionFilter
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来我计划为后期操作创建属性[AllowReadOnlyUser],例如更改密码/电子邮件,并在过滤器中允许该操作通过.

我想知道是否有更好的方法来做这种事情?

更新:该应用程序不是为了公共消费.它在企业界用于跟踪人员,资产和其他无聊的数据.

更新2:我似乎完成了这项任务.将其作为控制器完成,就像启动一样.您可以在我的博客中看到完整的代码和一些解释.

Dir*_*eek 4

您可以使用 System.Web.Mvc.AuthorizeAttribute 来达到您的目的。创建一个派生自 AuthorizeAttribute 的类并重写方法 AuthorizeCore 和 HandleUnauthorizedRequest。在 AuthorizeCore 中,您确定是否允许用户执行某个操作,在 HandleUnauthorizedRequest 中,您确定在不允许时显示什么(例如,显示“NotAllowed”视图)。

创建自定义授权属性后,您必须将该属性添加到应受自定义授权保护的所有控制器操作。例如,所有 POST 方法。但是,如果存在应允许所有用户使用的 POST 方法,则只需不要将该属性添加到该控制器操作即可。

  • 您仍然可以在控制器级别使用 AuthorizeAttribute,甚至可以从具有适当属性的自定义控制器派生控制器。如果方法有自己的 AuthorizeAttribute,则不要在控制器级别执行任何操作。您必须重写 OnAuthorization 方法来检查方法级别属性。不过,仍然意味着修改所有控制器。但我不确定通常通过名称和请求类型捕获方法是否是一个好主意,因为它同样依赖于组织级别上应用的约定(我们仅使用“创建”来创建方法)。 (2认同)