隐藏URL MVC4中的参数

时间:2013-08-28 08:23:00

标签: asp.net-mvc-4

我正在使用VS 2010和MVC4(Razor)开发应用程序。我坚持使用Url参数。我能够实现LogIn方法。一旦我验证用户,我希望他重定向到其他页面,所以我正在使用

RedirectToAction("UserAction","User",new{userID = "",password=""});

但问题是RedirectToAction使用HTTTPGet所有url参数userID和密码都可见。

如何使用HTTPPost调用RedirectToAction。

任何帮助都将受到高度赞赏。 这是我的Login.cshtml

@using (Html.BeginForm("SignIn", "Login", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>Log in Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName, new { id = "UserName" })
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password, new { id = "Password" })
@Html.ValidationMessageFor(m => m.Password)
</li>

</ol>   
<input type="submit" value="Log in"/>
</fieldset>
} 

这是我的登录控制器

bool IsValidUser = ValidateEachUser(oLoginModel.
UserName,oLoginModel.Password);           
if (IsValidUser)
return (RedirectToAction("UserDetails", "User", new { userID = userID, 
password = 
password }));
else
return View("Login");

Thanx和问候

4 个答案:

答案 0 :(得分:1)

解决方案就像@anaximander提到的那样。成功登录后,将用户详细信息保存在随每个请求提交的加密cookie(例如FormsAuthenticationTicket)中,然后您可以通过解密cookie来验证每个操作调用的凭据。如果您想实现自己的验证协议,您甚至可以实现自己的AuthorizeAttribute并手动装饰所有方法或在Global.asax中全局注册(在RegisterGlobalFilters内​​)。

您应该考虑是否确实需要保留密码。用户请求包含加密cookie的事实可用作用户已经过身份验证的指示。如果要确保用户有权运行某种操作方法,则用户ID应该足够。这将节省您必须存储密码并在每次调用时重新检查它,然后检查用户是否有权运行该方法。

答案 1 :(得分:0)

TempData - 回答您的问题:

TempData["userID "] = "some";
TempData["password"] = "some";
RedirectToAction("UserAction","User");

这可能有用。如果它没有添加评论:)

答案 2 :(得分:0)

如果你想要一个方法HTTPPOST把方法的头像:

  

[HTTPPOST]   RedirectToAction(您的参数){}

答案 3 :(得分:0)

这开始是一些评论,但我认为现在已经足够值得回答。

识别用户的最佳方法可能是使用包含识别令牌的加密cookie - 而不是他们的密码 - 以便您可以检查用户是谁。每次请求都会发送cookie,无需额外的工作。如果需要,可以查看。动作过滤器是一种巧妙的方法。

ASP.NET MVC 4内置了一个非常好的Forms auth系统,其工作方式与此完全相同。那里有很多教程; this one是一个很好的例子。它实现起来非常简单,您可以覆盖一些工作部分以使用您自己的数据库,您自己的用户模型等。用户提供凭据,您检查它们,系统为用户提供cookie。 [Authorize]过滤器检查该cookie并使用它来决定是否允许用户执行他们正在尝试执行的操作。还有基于角色的授权的范围,但如果您不需要,可以忽略它。

无论你做什么,你都不想在任何地方保留用户的密码。如果您最终使用自己的数据库来存储用户,请不要将密码保存在那里 - 查找类似bcrypt的内容,使用它来使用随机盐散列密码,并将其与salt值一起存储。要检查用户的登录信息,请使用您提供的盐对它们提供的内容进行哈希处理,并查看输出是否与您保存的哈希值匹配。密码保留在系统中的时间越短,攻击者可以抓住它的窗口就越窄。