对于某些操作,例如更改电子邮件设置或管理员活动,我希望用户在操作完成之前重新进行身份验证。在ASP.NET MVC 3中有这么好的模式吗?
答案 0 :(得分:2)
您可以使用Username
,Password
和要更改的字段(Email
)创建ActionMethod。而不是在数据的[HttpPost]
中验证此数据。如果授权成功,请更改它,如果没有将错误添加到ModelState
。
使用ViewModel。
public class ChangeEmailViewModel
{
public string Username { get; set; }
public string Password { get; set; }
public string EmailAddress { get; set; }
}
public ActionResult ChangeEmail()
{
return this.View(new ChangeEmailViewModel());
}
public Action ChangeEmail(ChangeEmailViewModel model)
{
// authorize
bool isAuthorized = // your logic.
if (isAuthorized)
{
// change email
} else
{
ModelState.AddModelError("Username", "Username is not valid");
}
return this.View(model);
}
答案 1 :(得分:0)
如果您想动态拦截并重新验证已经过身份验证的人,您可以使用特殊的cookie处理此问题。需要重新验证的操作可以使用自定义过滤器进行修饰,该过滤器会覆盖OnAuthorization以检查cookie,然后重定向以获取用户名&密码如果找不到。模式,没有代码:
User clicks link to uber-protected action.
Filter on action looks for cookie and does not find it, redirects to sign in.
User signs in, and you write a special cookie
(different from the forms auth cookie),
then redirect back to original action.
Filter on action looks for cookie and finds it authorizing user.
cookie的生命周期至少必须一直到超级保护动作的http帖子。您将不得不决定何时删除它。例如,在用户为一个受超级保护的操作重新验证后,您是否希望它们在同一个浏览器会话中重新验证第二个受超级保护的操作?