2013-08-28 64 views
1

我正在开发一个应用程序,使用VS 2010和MVC4(Razor)。我被卡住的Url参数。我能够实现LogIn方法。有一次,我验证用户我想他重定向到其他页面,所以我用隐藏URL中的参数MVC4

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

但问题是RedirectToAction usses HTTTPGet所有的URL参数,用户ID和密码是可见的。

如何使用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"); 

感谢名单和问候

+1

为什么你会在登录后在UserDetails视图中需要密码?不够UserId? –

+0

我需要密码,因为对于用户进行的每个操作,我都应该验证用户。 – user1418667

+0

我已经用Google搜索,很多链接都说使用HTTPPOST。但我不知道如何实现这一点,因为登录控制器中的SignIn方法是HTTPPOST方法。我如何使RedirectToAction成为POST。 – user1418667

回答

0

TempData - 是你的问题的答案:

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

这可能会工作。如果它不添加评论:)

+0

。但是在这个地方我既不想使用TempData,也不想使用会话,或ViewData或ViewBag。有没有其他方法来实现它 – user1418667

+0

我不明白为什么你不想使用TempData或会话,或ViewData或ViewBag。但不幸的是,我不知道任何其他方式来实现它:( –

1

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

你应该真的想一想,你是否真的需要保持密码。用户请求包含您的加密cookie的事实可以用作用户已被认证的指示。如果您想确保用户有权运行某个操作方法,那么用户标识应该足够了。这可以节省您在检查用户是否有权运行该方法之前,必须存储密码并在每次调用时重新检查密码。

+0

是的,我使用HTTPFilters的验证 – user1418667

0

,如果你想一个方法HTTPPOST放头的方法,如:

[HTTPPOST] RedirectToAction(您参数){}

0

这开始为一对夫妇的意见,但我认为现在已经足够值得将其作为答案。

识别用户的最佳方式可能是使用包含识别令牌的加密cookie(不是他们的密码),以便您可以检查用户是谁。这个cookie会随着每一个请求而悄悄地发送,而不需要额外的工作。如果你需要它,你可以检查它。一个动作过滤器是一个很好的方法来做到这一点。

ASP.NET MVC 4内置了一个完美的Forms Auth系统,其工作原理与此类似。那里有很多教程。 this one是一个体面的例子。它的实现非常简单,你可以重写几个部分的工作来使用你自己的数据库,你自己的用户模型等等。用户提供证书,检查它们,系统给用户一个cookie。[Authorize]过滤器会检查该cookie并使用它来决定是否允许用户执行他们正在尝试执行的操作。还有基于角色的授权范围,但如果您不需要,您可以忽略它。

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

+0

是的,这是绝对正确的。我会照顾,我会找到一个替代存储密码。 – user1418667