繁体   English   中英

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

[英]How to redirect after authentication with MVC5 views

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

这是我目前所拥有的:

@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>
}

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

您可以在loggof方法中使用Request对象的UrlReferrer属性来获取引用URL,并将该URL传递给您的登录操作方法,并使用该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 Action方法中从TempData读取它。

确保您具有LoginVM的ReturnURL属性作为表单的一部分(在隐藏变量中),以便当用户发布登录表单时,该表单将在Login HttpPost操作方法中可用。

@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
}

您需要在登录控制器和链接中进行一些工作以实现此目的。 基本上,您会将传入的页面作为参数传递给登录控制器,然后使用该链接在成功登录后将用户转发回该页面。

在您的登录视图的Beginform中添加返回URL。

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

将新参数添加到您的LoginActionABC。

public ActionResult LoginActionABC(string returnUrl)

这可能对您有帮助

这是我使用的代码,最终使该代码正常工作。

在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 } });
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM