我有一个遵循PRG模式的MVC3应用程序,我正在寻找一种最好的方式来定义我的应用程序的导航规则。例如,我有一个具有页面A、B、C和D的应用程序。假设A是一个登录页面。用户登录成功后,用户将被重定向到页面B。现在我不想让用户在地址栏中键入页面C的url并访问页面C(页面C应该只能在发布页面B或从页面D返回按钮后才能访问)我也必须为所有其他页面设置类似的规则(比方说,当用户在页面D中时,不应该允许他们进入页面B)
目前,我有一个选项,可以检查@Request.UrlRefferer属性以获取每个请求的源,并决定重定向到哪个页面。我不确定这是不是最好的解决方案。
感谢您的反馈!!
发布于 2011-06-20 09:35:47
我最终完成了这个任务,如下:
我选择这种方法很简单,因为一旦应用程序进入生产,它肯定会在解决问题/故障排除过程中提供帮助,这对我来说很重要。
感谢大家的回复!
发布于 2011-06-17 12:23:08
不要把你的安全建立在这个基础上。使用Authorize属性来定义安全性。UrlReferrer也很容易被伪造。
为什么你要限制这一点?如果您有业务原因,用户最常经历的是一个特定的流程,那么可以考虑使用cookie、会话或数据库条目来记录其当前的“完成”状态--即使用某种持久的方法来确定这一点。你也可以根据会话id形成一个令牌,然后传递到每个页面中。如果令牌存在并且与用户的当前会话匹配,则为它们加载页面。当然,如果用户理解这一点,这是可以伪造的-但如果您只是试图确保正确的流程,那么这也是一种方法。用户在达到前一步之前将不会得到其中具有当前会话id的链接。
发布于 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中,您可以将其应用于您的操作方法或整个控制器。如果你想更详细地解释这项技术,请给我留言,我会写另一个更详细地描述这项技术的答案。
下面是上述技术的快速概念验证:
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,比如RedirectToRoute或View,您可以为filterContext.Result属性设置值。
https://stackoverflow.com/questions/6380988
复制相似问题