登录后MVC 4重定向用户

时间:2014-08-19 20:25:40

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

如何在成功登录特定页面后重定向用户。我需要通过授权属性来做到这一点。在我的问题中,我必须将用户重定向到页面:索引/关于他/她何时使用特定登录名,其余用户将被重定向到索引/主页。

我尝试这种方法:

public class AuthAttribute : AuthorizeAttribute
{
    private string userName;

    protected override bool AuthorizeCore(HttpContextBase filterContext)
    {
        var authorized = base.AuthorizeCore(filterContext);

        if (!authorized)
        {
            return false;
        }

        string userAuthenticated = filterContext.User.Identity.Name;
        bool specialUser = userName.Equals(userAuthenticated,    StringComparison.OrdinalIgnoreCase);

        if (specialUser)
        {
            filterContext.Items["RedirectToHomeAbout"] = true;
            return false;
        }

        return true;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.Items.Contains("RedirectToHomeAbout"))
        {
            var routeValues = new RouteValueDictionary(new
            {
                controller = "Home",
                action = "About",
            });

            filterContext.Result = new RedirectToRouteResult(routeValues);
        }
        else
        {
            base.OnAuthorization(filterContext);
        }
    }

这是帐户控制器的代码:

[授权]     [InitializeSimpleMembership]     public class AccountController:Controller     {         //         // GET:/帐户/登录

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

    //
    // POST: /Account/Login

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

    //
    // POST: /Account/LogOff

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        WebSecurity.Logout();

        return RedirectToAction("Index", "Home");
    }

谢谢! MARQ

2 个答案:

答案 0 :(得分:0)

您可能希望覆盖 HandleUnauthorizedRequest ,而不是覆盖 OnAuthorization

通过这种方式,代码看起来像:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {

    if (filterContext.HttpContext.Items.Contains("RedirectToHomeAbout"))
    {
        filterContext.Result = new RedirectToRouteResult(
                                   new RouteValueDictionary 
                                   {
                                       { "action", "About" },
                                       { "controller", "Home" }
                                   });
    }
    else
    {
        //your general redirect here
    }
}

答案 1 :(得分:0)

如果我正确理解您的要求,您可以在AccountController中执行此操作:

    private string specificUserName = "specificUserName";

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            if (string.Equals(model.UserName, specificUserName))
            {
                return RedirectToAction("Index", "About");
            }
            return RedirectToAction("Index", "Home");
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }