ASP.NET MVC 4应用程序中的自定义身份验证

4

我要将一个老的ASP.NET Web Forms应用程序迁移到ASP.NET MVC 4。我对ASP.NET MVC不是很熟悉,如果这是个愚蠢的问题,请原谅。简而言之,我的ASP.NET Web Forms应用程序使用以下代码在用户登录时重定向用户:

FormsAuthentication.RedirectFromLoginPage(username, true);

我以为只需复制并粘贴此代码即可。然而,我注意到它试图将用户重定向到 "default.aspx"。这个调用的MVC等效方法是什么?

谢谢!


我不熟悉那个特定的方法 RedirectFromLoginPage。你考虑过使用 new RedirectResult("/my_front_page"); 吗? - Oliver
我假设它考虑了 returnUrl 吗?你可以使用 if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } return RedirectToRoute("Index"); 或类似的东西。 - Brad Christie
@Oliver RedirectFromLoginPage 会放置一个身份验证 cookie,然后将用户重定向到查询字符串中指定的 ReturnUrl 参数所在的位置,否则将重定向到默认 URL。 - MikeSmithDev
@MikeSmithDev 我明白了,那似乎是一些奇怪的复合功能。 - Oliver
4个回答

3

表单验证通常会提供一个查询字符串参数 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);
}

1
在控制器的登录方法中添加一个参数字符串"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)%>

0

0
在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互联网模板创建的默认HomeController上。用户体验将是,如果他们在主页上单击“联系人”选项卡并且未登录,则会被重定向到登录页面。一旦他们成功登录,他们将被重定向回“联系人”页面。因此,MVC 4互联网应用程序已经为您准备好了所有的连接,并且您不必显式处理重定向。有关自定义SimpleMembership提供程序的更多信息您可以阅读此博客


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接