0

我只是想就我应该如何解决这个问题并最终寻求快速取胜来评估意见(思考事情的错误方式坚果时间压力意味着我必须快速思考和行动!

我得到了一个有一点问题的网站。

我使用标准表单身份验证作为 User1234 登录,我的网址如下:

www.mywebsite.co.uk/1234/Contact。

这将带我到 User1234 的详细信息。

您可以将两个和两个放在一起,并正确假设 1234 是某种用户 ID。

一旦通过身份验证,我可以访问存在 [Authorize] 属性的视图,任何匿名/未经身份验证的用户都会被重定向。

但是,一旦以 User1234 身份登录,我就可以像这样修改 url:

www.mywebsite.co.uk/1235/Contact。

所以我被认证为 User1234 但可以看到 User1235 的数据。这很糟糕,原因很明显。

当我登录时,我主动在会话中设置登录 ID,所以理论上,我可以在用户点击 ActionResult 时进行检查,我可以交叉检查 URL 中存在的 ID 与会话登录 ID。然而,这是一个包含大量操作结果的相当项目,因此,我不愿意在周六下午为每个操作结果添加一些内容。

global.asax 中是否有我可以使用的事件在每个 ActionResult 请求中被命中,我可以在其中将会话登录 ID 与 url ID 进行比较?

或者,任何人都可以就我如何实现这一点或限制 URL 篡改提供一些建议吗?

4

3 回答 3

1

您可以尝试做一个基本控制器

public class BaseController : Controller 
{
     protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //Do your stuff here
        base.OnActionExecuted(filterContext);
    }

}
于 2013-01-05T21:53:29.330 回答
0

我假设您不想更改 URL 路由,因为您也可以从会话中检索用户 ID。一个快速的解决方案是使用可以放置在受影响的控制器或操作方法上的 ActionFilter:

public class VerifyUserIdAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var sessionUserId = filterContext.HttpContext.Session["UserId"];

        var routeUserId = filterContext.RouteData.Values["UserId"];
        if (routeUserId != null && sessionUserId == routeUserId)
            filterContext.Result = new RedirectResult("<<url to redirect to>>");
    }
}
于 2013-01-05T23:51:03.493 回答
-1

我不明白为什么 URL 包含数据入口点。这似乎是一个设计缺陷。我将删除所有使用 URL 参数的代码,并确保控制器根据登录用户查找 ID。

于 2013-01-05T23:03:13.160 回答