1

我有一个带有控制器的 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 总是假的。我检查了我的饼干。当我登录时,有一个名为:

.ASPXAUTH

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

4

1 回答 1

3

只需同时使用AuthorizeAllowAnonymous过滤器:

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

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

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

例如在“Accounts”控制器中:

[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()
    }
}
于 2013-04-02T19:22:04.767 回答