如何在使用MVC5视图进行身份验证后重定向

时间:2014-02-20 15:21:09

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

我有一个MVC5项目和一个Razor视图,向人们显示他们的登录名。我想要做的是给人们 Not me 选项以其他用户身份登录,然后重定向回此视图。

这是我目前所拥有的:

@if (Request.IsAuthenticated)
{
    <div class="alert alert-dismissable alert-warning">
    You are signed in as: @HttpContext.Current.User.Identity.Name
    @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "" }))
    {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Change</a>
    }
    </div>
}

唯一的问题是,在登录后,我希望用户自动重定向返回此页面而不是主页。我怎样才能做到这一点?谢谢。

4 个答案:

答案 0 :(得分:1)

您可以在loggof方法中使用Request对象的UrlReferrer属性来获取引用URL并将其传递给您的登录操作方法,并在成功登录后使用该方法重定向用户。

您可以将returnurl作为查询字符串传递给登录操作方法或使用TempData

[HttpPost]
public ActionResult LogOff()
{
   var prevUrl = Request.UrlReferrer.AbsoluteUri;
   //Do the things to end the session       
   return RedirectToAction("Login", new { returnUrl=prevUrl});
}
public ActionResult Login(string returnUrl="")
{
  var loginVM=new LoginVM();
  if(!String.IsNullOrEmpty(returnUrl))
     loginVM.ReturnUrl=returnUrl;

  return View(loginVM);
}

如果您更喜欢 TempData 方法

   var prevUrl = Request.UrlReferrer.AbsoluteUri;
   //Do the things to end the session   
   TempData.ReturnUrl=prevUrl;    
   return RedirectToAction("Login");

Login操作方法中,请从TempData开始阅读。

确保您将LoginVM的ReturnURL属性作为表单的一部分(在隐藏变量中),以便当用户发布登录表单时,它将在登录HttpPost中可用< / strong>行动方法

@model LoginVM
@using(Html.BeginForm())
{
  // you other login form elements (username,password) here
  @Html.HiddenFor(s=>s.ReturnUrl)
  <input type="submit" />
}

并在您的 HttpPost 操作

[HttpPost]
public ActionResult Login(LoginVM model)
{
  //if login was successful, use model.ReturnUrl to redirect
}

答案 1 :(得分:0)

您需要在登录控制器和链接中做一些工作才能实现这一目标。基本上,您将把来自的页面作为参数传递给登录控制器,然后使用该链接在成功登录时将用户转发回该页面。

答案 2 :(得分:0)

在登录视图的Beginform中添加返回网址。

@using (Html.BeginForm("LoginActionABC", "LoginControllerABC", new { **ReturnUrl** = 'your url' }))

将新参数添加到LoginActionABC。

public ActionResult LoginActionABC(string returnUrl)

这可能会对你有所帮助

答案 3 :(得分:0)

这是我使用的代码,最终使用了这个代码。

在Razor视图中,我只需要添加一个带有returnUrl值的隐藏输入:

@if (Request.IsAuthenticated)
{
    <div class="alert alert-dismissable alert-warning">
    You are signed in as: @HttpContext.Current.User.Identity.Name
    @using (Html.BeginForm("ChangeLogin", "Account", FormMethod.Post, new { id = "logoutForm", @class = ""}))
    {
        @Html.AntiForgeryToken()
        <input type="hidden" name="returnUrl" value="/Item/Bid/@Model.ID" />
        <a href="javascript:document.getElementById('logoutForm').submit()">Change</a>
    }
    </div>
}

在帐户控制器中,我添加了一个新方法来执行注销并使用返回URL重定向到登录页面:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ChangeLogin(string returnUrl)
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Login", "Account", new System.Web.Routing.RouteValueDictionary { { "returnUrl", returnUrl } });
    }

更改身份验证后,这会成功将用户导航回原始视图。非常感谢帮助我达到这一点的其他建议。