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:我似乎完成了这项任务.将其作为控制器完成,就像启动一样.您可以在我的博客中看到完整的代码和一些解释.
您可以使用 System.Web.Mvc.AuthorizeAttribute 来达到您的目的。创建一个派生自 AuthorizeAttribute 的类并重写方法 AuthorizeCore 和 HandleUnauthorizedRequest。在 AuthorizeCore 中,您确定是否允许用户执行某个操作,在 HandleUnauthorizedRequest 中,您确定在不允许时显示什么(例如,显示“NotAllowed”视图)。
创建自定义授权属性后,您必须将该属性添加到应受自定义授权保护的所有控制器操作。例如,所有 POST 方法。但是,如果存在应允许所有用户使用的 POST 方法,则只需不要将该属性添加到该控制器操作即可。
| 归档时间: |
|
| 查看次数: |
1811 次 |
| 最近记录: |