【问题标题】:Custom Authentication in ASP.NET MVC 4 appASP.NET MVC 4 应用程序中的自定义身份验证
【发布时间】:2013-01-29 13:32:34
【问题描述】:

我正在将旧的 ASP.NET Web 窗体应用程序迁移到 ASP.NET MVC 4。我对 ASP.NET MVC 不是很熟悉,所以如果这是一个愚蠢的问题,我深表歉意。简而言之,我的 ASP.NET Web 窗体应用程序在登录时使用以下代码行重定向用户:

FormsAuthentication.RedirectFromLoginPage(username, true);

我以为我可以复制并粘贴这段代码。但是,我注意到它试图将用户重定向到“default.aspx”。这个调用的 MVC 等效项是什么?

谢谢!

【问题讨论】:

  • 我不熟悉那个特定的方法RedirectFromLoginPage。您是否考虑过使用new RedirectResult("/my_front_page");
  • 我认为它考虑到returnUrl?你可以使用if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } return RedirectToRoute("Index"); 或类似的东西。
  • @Oliver RedirectFromLoginPage 丢弃身份验证 cookie,然后将人员重定向到查询字符串的 ReturnUrl 参数中指定的位置,否则重定向到 defaultUrl。
  • @MikeSmithDev 我明白了,这似乎是一些奇怪的复合功能

标签: c# asp.net-mvc-4


【解决方案1】:

表单身份验证通常提供一个returnUrl 作为查询字符串参数(我假设FormsAuthentication.RedirectFromloginPage(username, true) 正在使用它。)话虽如此,向您的登录操作添加一个参数,该参数接收returnUrl,然后在您的登录操作中使用它。

[HttpPost]
public ActionResult Login(LoginViewModel model, String returnUrl)
{
    if (ModelState.IsValid)
    {
        // perform login
        if (YourFormsAuthentication.YourLoginMethod(mode.username, model.password))
        {
            //
            // Set auth cookie, log user in, etc.
            //

            // Now check for returnUrl and make sure it's present and
            // valid (not redirecting off-site)
            if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            // no returnUrl provided, direct them to default landing page
            return RedirectToRoute("Home");
        }
        else
        {
            ModelState.AddError("", "Username or password are incorrect.");
        }
    }
    return View(model);
}

【讨论】:

    【解决方案2】:

    在控制器中的登录方法上添加参数字符串 returnUrl。

    然后检查它是否为空或null。如果不重定向。

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
           // Do your login
        // if success
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
    }
    

    在您看来,还要传递 returnUrl(即 Request.Url)

    <%: Html.ActionLink("Log On", "LogOn", "ControllerName", new { returnUrl = Request.Url }, null)%>
    

    【讨论】:

      【解决方案3】:

      这里有完整的示例:http://www.c-sharpcorner.com/UploadFile/cd3310/using-mvc-Asp-Net-tools-create-simple-login-form/

      使用具有特定操作的控制器查看

          [AcceptVerbs(HttpVerbs.Post)]
          public ActionResult Login(YourModel model)
          {
              if (!ModelState.IsValid)
              {
                  return View("Login", model);
              }
      
              return RedirectToAction("Index");
          }
      

      【讨论】:

        【解决方案4】:

        在 MVC 4 中,如果您创建一个新应用程序并选择 Internet 应用程序选项,该模板将为表单身份验证连接所有内容,并将设置您使用 SimpleMembership 提供程序,这样可以更轻松地自定义用户配置文件并添加对轻松插入 OAuth。您的 web.config 中应该有以下条目。

        <authentication mode="Forms">
          <forms loginUrl="~/Account/Login" timeout="2880" />
        </authentication>
        

        如果用户未通过身份验证或授权,这会告诉应用程序重定向到 loginUrl。然后,您只需在控制器或操作上使用AuthorizeAttribute。如果您想使用基于角色的授权或仅在没有角色的情况下使用它,您可以将角色添加到此属性。在这里,我为 HomeController 的 Contact 操作添加了 AuthorizeAttribute。

            [Authorize(Roles="Admin")] 
            public ActionResult Contact()
            {
                ViewBag.Message = "Your contact page.";
        
                return View();
            }
        

        此操作在由 MVC 4 Internet 模板创建的默认 HomeController 上进行。用户体验将是,如果他们单击主页上的“联系人”选项卡并且他们没有登录,他们将被重定向到登录页面。一旦他们成功登录,他们将被重定向回联系人页面。因此,MVC 4 Internet 应用程序已经为您准备好了所有内容,您不必显式处理重定向。有关自定义 SimpleMembership 提供程序you can read this blog 的更多信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-06
          • 1970-01-01
          • 1970-01-01
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多