1

我正在开发一个应用程序,使用 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");

感谢和问候

4

4 回答 4

1

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

您应该认真考虑是否真的需要保留密码。用户请求包含您的加密 cookie 的事实可以用作用户已通过身份验证的指示。如果要确保用户被授权运行某个操作方法,用户 id 应该足够了。这将使您不必存储密码并在每次调用之前重新检查它,然后再检查用户是否有权运行该方法。

于 2013-08-28T08:48:01.030 回答
0

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

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

于 2013-08-28T08:53:41.477 回答
0

这开始是一些评论,但我认为现在有足够的价值让它成为一个答案。

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

ASP.NET MVC 4 内置了一个非常好的 Forms 身份验证系统,其工作方式与此完全一样。那里有很多教程;是一个很好的例子。实现起来非常简单,您可以覆盖工作的一些部分以使用您自己的数据库、您自己的用户模型等。用户提供凭据,您检查它们,然后系统给用户一个 cookie。过滤器检查该[Authorize]cookie 并使用它来决定是否允许用户做他们想做的事情。还有基于角色的授权的范围,但如果你不需要,你可以忽略它。

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

于 2013-08-28T09:12:45.733 回答
0

TempData- 回答你的问题:

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

这可能会奏效。如果它没有添加评论:)

于 2013-08-28T08:28:05.917 回答