Authentication MVC5 EF6如何在提交数据之前添加带有附加身份验证的确认屏幕

Authentication MVC5 EF6如何在提交数据之前添加带有附加身份验证的确认屏幕,authentication,asp.net-mvc-5,asp.net-mvc-viewmodel,Authentication,Asp.net Mvc 5,Asp.net Mvc Viewmodel,开发一个新的MVC5项目。我已经为CRUD功能准备好了脚手架,但有一个要求,即当插入或更新数据时,需要电子签名。在将数据提交到数据库之前,必须向用户显示一个页面,要求他们再次输入用户名和密码以确认数据。如果输入的用户名和密码有效且用户名与当前登录的用户匹配,则可以将输入的原始数据保存到其表(例如成员)中,并将电子签名信息保存到单独的表e签名中。如果您能为我提供帮助,我将不胜感激。您可以提供一个结合了成员和ESignature的视图模型,或者重新使用来自帐户控制器的LoginViewModel来检

开发一个新的MVC5项目。我已经为CRUD功能准备好了脚手架,但有一个要求,即当插入或更新数据时,需要电子签名。在将数据提交到数据库之前,必须向用户显示一个页面,要求他们再次输入用户名和密码以确认数据。如果输入的用户名和密码有效且用户名与当前登录的用户匹配,则可以将输入的原始数据保存到其表(例如成员)中,并将电子签名信息保存到单独的表e签名中。如果您能为我提供帮助,我将不胜感激。您可以提供一个结合了成员和ESignature的视图模型,或者重新使用来自帐户控制器的LoginViewModel来检查身份验证,或者另一种方法?我需要一些我可以在需要电子签名的六个控制器上使用的东西。

好吧,也许我的方法不是最好的,但我会尝试

我的解决方案是创建一个CustomAttribute:AuthorizeAttribute并修饰所有需要Esignature的操作。在CustomAttribute实现中,您将重定向到与登录完全类似的控制器操作,但只需稍加修改

public class CustomAuthorize : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            var url = filterContext.HttpContext.Request.Url;
            var query = url.Query;
            if (query.Contains("g="))
            {
                var code = query.Split(new String[] { "g=" }, StringSplitOptions.None);
                //You can create time sensistive token and validate it.
            }
            else
            {
                //Redirect User to a particular page
                filterContext.Result = new RedirectToRouteResult(
                                        new RouteValueDictionary 
                                    {                                    
                                    { "controller", "Account" },
                                    { "action", "elogin" },
                                    { "redirectUrl", url.AbsolutePath}
                                    }
                );
            }
        }

    }
然后用它来装饰例如索引方法

[CustomAuthorize]
public ActionResult Index()
{
  return View();
}
首先,当您点击Index方法,然后在CustomAuthorization属性的OnAuthorization方法中执行else循环,并将您重新定向到AccountController中的elogin方法。此方法类似于登录HttpGet方法。在指定RedirectResult时,我指定的是当前页面的redirectUrl路径,因此当您成功验证elogin方法中的用户时,在redirectUrl的帮助下,我们可以返回

 [AllowAnonymous]
        public ActionResult ELogin(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View("Login");
        }

        //
        // POST: /Account/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ELogin(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindAsync(model.UserName, model.Password);
                if (user != null)
                {
                    await SignInAsync(user, model.RememberMe);
                    var url =  String.Format("{0}/?g={1}", returnUrl, "HashCode");
                    return RedirectToLocal(url);
                }
                else
                {
                    ModelState.AddModelError("", "Invalid username or password.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }
HttpPost-ELogin方法的唯一区别在于,在执行RedirectToLocal I append/g=HasCode之前。注意:这里您可以附加您自己的逻辑来创建一个时间敏感的散列。当我们被重定向到主页时,我们可以在OnAuthorization方法中检查url是否包含g=HashCode,然后不要重定向到登录页面


这将是一个非常基本的想法,您可以在用户点击特定控制器时强制用户重新登录。您必须进行额外的安全检查,并小心通过url公开的内容

但是,通过装饰视图,在输入任何数据之前将调用ELogin方法。我需要用户能够首先输入其有效数据,然后再重定向以通过签名确认数据输入,然后如果签名有效,将数据写入数据库。如果在用户提交后重定向,则如果在用户重新登录之前不保留数据,则数据将丢失。如果用户未成功签名,我可以保留数据,然后回滚。还考虑使用引导模式,这样我就不会离开页面,但不知道如何获取在模式中输入的值,以便在控制器中使用。因此,如果您可以通过模式显示登录,那么在模式提交按钮方法中,您可以将值存储在隐藏字段中,表示IsAuthenticated属性。这个隐藏字段可能是模型上的强类型属性,您可以在控制器中获得它。