如何隐藏URL

时间:2015-05-25 04:06:01

标签: asp.net-mvc asp.net-mvc-3 query-string

我有一个Telerik网格,我在其中使用客户端模板对每条记录进行编辑/删除操作。因此,对于编辑/删除操作,我需要传递该记录的ID以及URL,在这种情况下,我担心一些安全问题。我正在寻找一种隐藏查询字符串参数的方法来克服这个问题。

我知道参数的加密,目前我正在使用它。但我想完全隐藏查询字符串参数。我不能在这里使用session / ViewBag,因为我无法在按钮点击时为每条记录设置会话值并在控制器中访问它。

感谢任何帮助。提前致谢。我的Controller和View代码如下

视图

@model IEnumerable<Data.Models.MyViewModel>
@{
    Volunteer.Data.User currentUser = (Data.User)Session["CurrentUser"];
}
<div id="myDivId">
    <p style="clear:none;">
        @Html.ActionLink("Add", "Create", "MyController", new { area = "", ID = ViewBag.MyDataID }, new { @class = "aMyClass" })
    </p>
    @{
        Html.Telerik().Grid<MyViewModel>().Name("MyGrid")
            .Columns(col =>
            {
                col.Bound(c => c.FirstName).Width("120px");
                col.Bound(c => c.LastName).Width("80px");
                col.Bound(c => c.Designation).Width("80px");
                col.Bound(c => c.Company).Width("80px");
                col.Bound(c => c.Married).Filterable(false).ClientTemplate(
                    "<input type='checkbox'" + "<#= Married?\"checked\":\"\" #>" + " OnClick='return false' />"
                    ).Width("40px");               
                if (currentUser.AdminRole == true || currentUser.Manager == true || currentUser.StaffRole == true)
                {
                    col.Bound(c => c.EmployeeID).Sortable(false).ClientTemplate(
                                        "<a href='" + Url.Content("~/MyController/Edit/") + "<#= EmployeeID #>' title='Edit Employee Details' class='edit'>Edit</a>" +
                                        "<a href='" + Url.Content("~/MyController/Delete/") + "<#= EmployeeID #>' title='Delete Employee Details' class='delete'>Delete</a>"
                    ).Title("Action").Width("75px");
                }
                else
                {
                    col.Bound(c => c.EmployeeID).Sortable(false).ClientTemplate(
                                        "<a href='" + Url.Content("~/MyController/Details/") + "<#= EmployeeID #>' title='Associated Party Details' class='details'>Details</a>"
                    ).Title("Action").Width("75px");
                }
            })

        .DataBinding(dataBinding => dataBinding.Ajax().Select("_GetEmployeeList", "MyController", new { id = "MyDataID" }))
        .Pageable()
        .Sortable()        
        .Render();
    }
</div>

控制器

public ActionResult Edit(int id)//Want to pass this id without using Query string parameter
{
    User user = (User)Session["CurrentUser"];

    Employee employee = db.Employees.Single(c => c.EmployeeID == id);
    //some code
    return View(employee);
}

[HttpPost]
public ActionResult Edit(Employee employee)
{
    User user = (User)Session["CurrentUser"];

    if (ModelState.IsValid)
    {
        db.Employees.Attach(employee);
        db.ObjectStateManager.ChangeObjectState(Employees, EntityState.Modified);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    Employee employee = db.Employees.Single(c => c.EmployeeID == id);
    //some code
    return View(employee);
}

2 个答案:

答案 0 :(得分:0)

  

但我想完全隐藏查询字符串参数。

查询字符串参数是使用GET方法的HTTP标准的一部分,因为它们是URI的一部分。

HTTP 1.1 Get Request

  

GET方法意味着检索任何信息(以。的形式)      entity)由Request-URI标识。

请理解,默认情况下,GET方法会在URI中发送可解析的信息,例如:

http://www.mywebsite.com/person?id=1
                                ^--- one location that can be parsed is the querystring

因此隐藏这意味着您需要更改发出请求的方式或更改请求类型。

@Html.ActionLink(/* irrelevant parameters*/)

创建Anchor Tag,锚标记的一部分是存储href的属性(URI)。据我所知,没有默认的方法来覆盖URI以不通过Querystring传递信息。

HTTP 1.1 Post Request

  

POST方法用于请求源服务器接受请求中包含的实体,作为请求行中Request-URI标识的资源的新下级。

这是一种奇特的说法,将信息发送到URI。但是这一次,你可以使用Querystring或使用请求的主体(据我所知,GET不允许请求的主体)。正文可以包含几乎任何类型的mime类型,但通常是application/x-www-form-urlencoded

另一段代码:

@Html.ActionLink("Add", "Create", "MyController", new { area = "", ID = ViewBag.MyDataID }, new { @class = "aMyClass" })

可能会:

@using(Html.BeginForm("Create", "MyController", FormMethod.Post))
{
  <input type="hidden" name="area" value="" />
  <input type="hidden" name="ID" value="@ViewBag.MyDataID" />
  <input type="submit" value="Add" />
}

根据您提出的问题,我强烈建议您在http://www.asp.net/mvc/overview/getting-started/introduction/getting-started阅读MVC。

答案 1 :(得分:0)

我不知道如何使查询字符串完全不可见,但我可以让它们无法访问。

一般的想法是使用查询字符串创建至少两个到url的路径。在您希望人们能够访问的路径中,创建一个重定向到您想要返回视图的操作的中间方法。第二条路径将直接访问我之前提到的那个动作。在中间方法中,您告诉数据库增加&#34的值;此页面在1之前被访问过。

您可能需要考虑下一部分几个小时才能获得99%的时间。在中间方法结束时,将值设置回0!在返回视图的操作中,使其成为只有在值设置为0时才能返回要返回的视图!但是,在返回视图之前,将值设置为1!虽然,这种方法不是100%安全。我认为这是唯一只使用基础知识和非常少的代码的实现。令人遗憾的是,查询字符串网址无法访问。它只会让人们更难访问网站。