【问题标题】:ASP.NET Identity - Not Authorized PageASP.NET 身份 - 未授权页面
【发布时间】:2015-09-30 18:45:44
【问题描述】:

如果用户不是管理员角色,我正在尝试插入 AccountController 中的默认 switch 语句并将用户重定向到“未授权”页面。

默认代码

// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
        case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
    }
}

这是我要添加到 switch 语句的 SignInStatus.Success 案例的内容

switch (result)
    {
        case SignInStatus.Success:
        //After successful login - check if the user is not in the admin role
            if (!UserManager.IsInRole(user.Id, "Admin"))
            {
                //Send to the Not Authorized page
                return View("NotAuthorized");
            }
            //Successful login with admin role
            else
            {
                //Return to where they came from 
                return RedirectToLocal(returnUrl);
            }
        case SignInStatus.LockedOut:
            //Lockout settings in IdentityConfig.cs
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }

如果我从帐户/登录开始,这一切正常,但如果我的 URL 附加了 ReturnURL,我无法将其重定向到未授权页面。

例如,我有一个如下所示的管理控制器。

[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
    // GET: Admin
    public ActionResult Index()
    {
        return View();
    }
}

如果我尝试直接进入该管理页面,当未登录时,我的页面将重定向到帐户/登录,并且 URL 将类似于 http://localhost:51250/Account/Login?ReturnUrl=%2FAdmin 这是在登录期间重定向到 NotAuthorized 不会工作的地方。如果我的 URL 看起来像这样 http://localhost:51250/Account/Login 重定向到 NotAuthorized 工作。

通过我的 switch 语句时它应该忽略返回 URL,我看不到我缺少什么。

【问题讨论】:

  • return View 不会重定向,returnurl 只是一个查询字符串,也不会影响重定向。我无法理解您的问题
  • 好的,如果我在 Account/Login 中进入登录页面并且我没有“Admin”角色,我的 switch 语句将检查角色并到达 return View("NotAuthorized"); 部分的代码。然后,我将进入 NotAuthorized 页面(视图)。如果我尝试相同的操作,但已从另一个页面重定向到帐户/登录(现在我附加了 returnURL),我将不会进入 NotAuthorized 页面,即使它仍然在我的开关中达到相同的代码 return View("NotAuthorized");声明。

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


【解决方案1】:

您没有进行重定向。您告诉它使用 NotAuthorized 视图进行登录操作。要进行重定向,请使用 RedirectToAction()。

return RedirectToAction("NotAuthorized");

如果您还没有帐户控制器,则需要在帐户控制器中添加 NotAuthorized 操作。

[AllowAnonymous]
public ActionResult NotAuthorized()
{
    return View();
}

【讨论】:

  • 优秀。这行得通。我不确定我是否完全理解为什么我的情况不起作用。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2017-03-11
相关资源
最近更新 更多