我下载的一个模板,想把登陆页面拿掉,通过其他验证方法直接传递一个工号给Controller 中的Logon。但是不加载登陆页面就是无法跳转到 LogOn(LogonViewModel model, string returnUrl),代码如下,帮忙解决,谢谢~
程序第一次加载运行顺序:OnAuthorization→LogOn()
加载登陆页面输入账号以后的运行顺序:OnAuthorization→LogOn(LogonViewModel model, string returnUrl)
怎样让程序第一次加载的时候的运行顺序就是 OnAuthorization→LogOn(LogonViewModel model, string returnUrl)
第一次的OnAuthorization 和加载登陆页面以后的OnAuthorization 运行的代码完全一样,为什么第一次不直接跳转到LogOn(LogonViewModel model, string returnUrl)
详细代码如下,谢谢~
AccountController 中的两个Logon Method
public class AccountController : BaseController { [AllowAnonymous] public ActionResult LogOn() { return View(); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult LogOn(LogonViewModel model, string returnUrl) { if (ModelState.IsValid) { //Login页面输入工号以后,GetUserByLoginID 从DB查询LoginUser的信息 User UserInfo = GetUserByLoginID(model.UserName); if (UserInfo == null) { //账号无登陆权限 //SetFlashMsg(ExceptionResx.exAccountLogon); //return RedirectToAction("Index", "Home"); } else if (UserInfo.UserEnable == false) { //账号Disable //SetFlashMsg(ExceptionResx.exAccountDisable); //return RedirectToAction("Index", "Home"); } else { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, model.UserName, DateTime.Now, DateTime.Now.AddHours(2), false, UserInfo.UserId.ToString(), FormsAuthentication.FormsCookiePath); FormsAuthentication.RenewTicketIfOld(ticket); string encryptTicket = FormsAuthentication.Encrypt(ticket); Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encryptTicket)); if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); //return RedirectToAction("Logon", "Account"); } } } //return View(model); return RedirectToAction("Index", "Home"); } }
BaseController 中的 protected override void OnAuthorization
protected override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated) { string CurrController = filterContext.RouteData.Values["controller"].ToString(); string CurrAction = filterContext.RouteData.Values["action"].ToString(); FormsIdentity id = (FormsIdentity)filterContext.HttpContext.User.Identity; FormsAuthenticationTicket ticket = id.Ticket; if (!string.IsNullOrEmpty(ticket.UserData)) { //string userCacheKey = string.Format("ST_User_{1}_{0}", ticket.UserData.Split('|').First(), Session.SessionID); string menuCacheKey = string.Format("ST_Menu_{1}_{0}", ticket.UserData.Split('|').First(), Session.SessionID); _CurrentUser = Factory.UserRepository.GetUserByUserId(int.Parse(ticket.UserData)); ViewData["User"] = _CurrentUser.Name; //AJAX not need Menu if (Array.IndexOf(_arySkipController, CurrController.ToUpper()) == -1) { if (filterContext.HttpContext.Cache[menuCacheKey] == null || Session["refresh_menu"] != null) { filterContext.HttpContext.Cache[menuCacheKey] = CaculateMenu(null); Session.Remove("refresh_menu"); } ViewData["Menu"] = filterContext.HttpContext.Cache[menuCacheKey] as IEnumerable<MenuItem>; List<Function> Functions = Factory.UserRepository.GetFunctionsByUserId(_CurrentUser.UserId).ToList(); if (Session["Error"] != null) { Session["Error"] = null; filterContext.Result = new HttpUnauthorizedResult(); return; } if (_CurrentUser.FirstLogin || _CurrentUser.Reset_Password_Due_Date <= DateTime.Now) { if (CurrController.ToUpper() == "ACCOUNT" && (CurrAction.ToUpper() == "CHANGEPASSWORD" || CurrAction.ToUpper() == "LOGOUT")) { return; } else { SetFlashMsg("you must change your password."); filterContext.Result = RedirectToAction("ChangePassword", "Account"); } } if ( (CurrController.ToUpper() != "HOME" && CurrAction.ToUpper() != "INDEX") && (CurrController.ToUpper() != "ACCOUNT" && (CurrAction.ToUpper() != "LOGON" || CurrAction.ToUpper() != "LOGOUT")) ) { List<Function> CheckEntity = Functions.Where(f => f.Controller == CurrController && f.Action == CurrAction).ToList(); if (CheckEntity == null || CheckEntity.Count == 0) { Session["Error"] = "Y"; filterContext.Result = new HttpUnauthorizedResult(); return; } } } } } ViewData["SystemVersion"] = "Version: " + Assembly.GetExecutingAssembly().GetName().Version.ToString(); base.OnAuthorization(filterContext); }
第一个不带参的logon()应该属于get请求,请求logon这个view视图,而后一个logon属于post请求,这是提交数据。
运行程序,就会调到第一个Get请求方法,然后加载登陆頁面,输入工號以后 才会加载第二个Logon方法
我想直接加载第二个Logon方法,该怎么弄?
@sirili: 你别把它想成两个方法嘛,你把第二个logon想成一个事件嘛。你都说了。要输入工号嘛,不要第一个,你在哪点输工号?
假设你的LogonViewModel里面有“工号”这个属性
Account/Logon?工号=xxx&url=xxx
这样就执行第二个action
第二个logon,是必须提交才能访问的,想直接访问,没搞过