首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 3页导航安全规则

MVC 3页导航安全规则
EN

Stack Overflow用户
提问于 2011-06-17 11:19:41
回答 3查看 724关注 0票数 0

我有一个遵循PRG模式的MVC3应用程序,我正在寻找一种最好的方式来定义我的应用程序的导航规则。例如,我有一个具有页面A、B、C和D的应用程序。假设A是一个登录页面。用户登录成功后,用户将被重定向到页面B。现在我不想让用户在地址栏中键入页面C的url并访问页面C(页面C应该只能在发布页面B或从页面D返回按钮后才能访问)我也必须为所有其他页面设置类似的规则(比方说,当用户在页面D中时,不应该允许他们进入页面B)

目前,我有一个选项,可以检查@Request.UrlRefferer属性以获取每个请求的源,并决定重定向到哪个页面。我不确定这是不是最好的解决方案。

感谢您的反馈!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-20 09:35:47

我最终完成了这个任务,如下:

  1. 在成功完成每个页面后,当用户请求新页面时,将页面名称保存在数据库
  2. 中,只需从数据库中检查他们最后完成的页面,并决定如何处理。

我选择这种方法很简单,因为一旦应用程序进入生产,它肯定会在解决问题/故障排除过程中提供帮助,这对我来说很重要。

感谢大家的回复!

票数 0
EN

Stack Overflow用户

发布于 2011-06-17 12:23:08

不要把你的安全建立在这个基础上。使用Authorize属性来定义安全性。UrlReferrer也很容易被伪造。

为什么你要限制这一点?如果您有业务原因,用户最常经历的是一个特定的流程,那么可以考虑使用cookie、会话或数据库条目来记录其当前的“完成”状态--即使用某种持久的方法来确定这一点。你也可以根据会话id形成一个令牌,然后传递到每个页面中。如果令牌存在并且与用户的当前会话匹配,则为它们加载页面。当然,如果用户理解这一点,这是可以伪造的-但如果您只是试图确保正确的流程,那么这也是一种方法。用户在达到前一步之前将不会得到其中具有当前会话id的链接。

票数 1
EN

Stack Overflow用户

发布于 2011-06-17 14:17:38

如果您不希望通过URL访问特定的页面,一个可用的选择是确保没有通过URL访问该页面的方法。要访问该页面,请执行一个将返回视图而不是重定向的POST操作。这意味着POST操作返回的视图将显示在带有上一页URL的页面上。例如:

页面A的URL是/login,在登录之后,用户被重定向到页面B。现在的URL是/home。页面B发送POST请求,页面内容变为页面C,但URL仍保留为/home。查看Page C内容的唯一方法是访问Page B并发送POST请求。

这打破了PRG模式,但这是一种选择。

还有一种替代方法,存储用户的当前权限,指示他们被允许进入哪个页面,并在执行操作之前检查用户是否有权查看页面。您可以将代码放在ActionAttribute中,您可以将其应用于您的操作方法或整个控制器。如果你想更详细地解释这项技术,请给我留言,我会写另一个更详细地描述这项技术的答案。

下面是上述技术的快速概念验证:

代码语言:javascript
复制
public class PermissionsNeeded : ActionFilterAttribute
{
    string expectedPermission;

    public PermissionsNeeded(string permission)
    {
        expectedPermission = permission;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var currentPermissions = filterContext.HttpContext.Session["CurrentPermissions"] as IEnumerable<string> ?? new List<string>();

        // If user does NOT have permission to access the action method
        if(!currentPermissions.Contains(expectedPermission)
        {
            throw new HttpException(403, "User is not authorized to view this page");
        }
    }
}

class YourController : Controller
{
    [HttpPost]
    public ActionResult PageB()
    {
        var currentPermissions = Session["CurrentPermissions"] ?? new List<string>();
        currentPermissions.Add("PostedFromPageB");
        Session["CurrentPermissions"] = currentPermissions;

        return RedirectToAction("PageC");
    }

    [PermissionsNeeded("PostedFromPageB")
    public ActionResult PageC()
    {
        return View();
    }
}

目前,自定义属性一次只接受一个权限,这是一个简单的限制,需要纠正。当您觉得用户不再具有某些权限时,您将负责删除存储在会话中的权限。我抛出了一个返回403状态码(未授权访问)的HttpException,但是如果您想返回一个ActionResult,比如RedirectToRouteView,您可以为filterContext.Result属性设置值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6380988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档