在ASP.NET MVC控制器中与授权和未授权用户共享操作

时间:2013-04-02 17:28:46

标签: asp.net-mvc authorization

我有一个带控制器的ASP.NET MVC应用程序。匿名用户可以访问此控制器中的所有操作。但是,如果用户通过身份验证,我想在操作中执行一些特殊操作。目前,我注意到无论如何,User.Identity.IsAuthenticated在此操作的上下文中始终为false。这是我的代码:

public class MyController : Controller
{
  public ActionResult GetProfile(string id)
  {
    if (User.Identity.IsAuthenticated) {
      ViewBag.ShowAuthStuff = true;
    } else {
      ViewBag.ShowAuthStuff = false;
    }
  }
}

如何使经过身份验证和未经身份验证的用户可以访问相同的操作,但执行不同的操作?我无法弄清楚为什么User.Identify.IsAuthenticated总是假的。我检查了我的饼干。当我登录时,有一个名为:

的cookie

.ASPXAUTH

但是,当我访问该操作时,该cookie不再可用。

1 个答案:

答案 0 :(得分:2)

只需使用AuthorizeAllowAnonymous过滤器:

[Authorize]
[AllowAnonymous]
public ActionResult GetProfile(string id)
{
    if (User.Identity.IsAuthenticated) {
        ViewBag.ShowAuthStuff = true;
    } else {
        ViewBag.ShowAuthStuff = false;
    }
}

虽然匿名访问“个人资料”并没有多大意义。

此外,通常,您不希望在同一控制器中混合授权和未授权的操作。最好是在控制器中一起执行必须或可能需要授权的操作,以及在单独的控制器中执行未经授权的操作。在这种情况下,您在控制器本身上指定Authorize过滤器,然后在想要与经过身份验证的用户交互但不需要它的任何单个操作上指定AllowAnonymous

例如在“帐户”控制器中:

[Authorize]
public class AccountsController : Controller
{
    public ActionResult Profile()
    {
        // Login required to reach here
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
        if (User.Identity.IsAuthenticated)
        {
            // Already logged in, redirect to profile
            return RedirectToAction("Profile");
        }

        // Show login form for anonymous user
        return View()
    }
}