我的任务是为我们的 ASP.Net MVC3 应用程序创建一个只读用户。即他们可以登录,查看所有数据,但不能更新任何数据。
我已经阅读了很多身份验证文章/框架,例如:实现安全的 ASP.NET MVC 应用程序,或流畅的安全配置,或在 ASP.Net MVC 中创建操作过滤器(以及其他一些,我已经失去了链接) .
大多数方法的问题是它们需要对域/应用程序进行重大更改。而且我只有一天时间来实现这个功能。
我们有大约 100 个控制器,每个控制器平均有 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
}
}
接下来我计划为发布操作创建属性 [AllowReadOnlyUser],例如更改密码/电子邮件,并在过滤器中允许该操作通过。
我想知道是否有更好的方法来做这种事情?
更新:该应用程序不供公众使用。它在企业界用于跟踪人员、资产和其他无聊的数据。
更新 2:我似乎已经完成了这项任务。开始时作为控制器完成。您可以在我的博客中看到完整的代码和一些解释。