0

我有一个 ASP.Net MVC 4 网站。当我开始这个网站时,我几乎没有网络编程经验,而且我认为我没有正确设置所有这些。

我有一些页面,例如主页、登录、注册,我认为它们是公共的,诸如 VerifyPIN 和 AccountCreated 之类的页面,我认为它们是内部的,以及诸如仪表板和个人资料之类的页面,它们是私有的。

我觉得公共页面应该由匿名用户访问,但是一旦用户登录,登录和注册不应该是可访问的。

内部页面我希望仅在服务器重定向时可用,并且从不通过浏览器,即我不希望用户能够输入 www.MySite.com/AccountCreated。

私人页面仅适用于登录用户。

我觉得我的私人页面运行良好,但我不知道如何限制对其他页面的访问,如上所述。也许我不允许登录用户访问登录页面的想法是未找到的。

由于网站的 ajax 特性,我的网站相对较小。我在所有公共页面上使用 [AllowAnonymous],但登录用户仍然可以访问这些页面,我不知道如何防止这种情况。

我的问题是,

如何阻止用户通过地址栏访问页面 (www.MySite.com/AccountCreated)

用户登录后,如何防止访问 [AllowAnonymous] 页面。

编辑

阻止已登录用户访问某些匿名页面(例如登录)是否正常?

4

4 回答 4

3

您可能总是检查用户是否已经登录。如果他这样做了,他将被重定向到另一个页面:

public ActionResult AccountCreated(some params)
{
           if (Request.IsAuthenticated)
            {
                return RedirectToAction("Index")
            }
            else
             {
              // login logic here
              }
}

您也可以直接在 View 中查看:

@if (Request.IsAuthenticated)
{
   <span> You are already logged in</span>
}
else
{
  //Login form here
}
于 2013-10-08T14:45:35.850 回答
1

对于您的第一个问题,您可以使用 [Authorize] 操作过滤器。

对于您的另一个问题,我想您将不得不编写自己的实现。您将需要创建一个新的 IAuthorizationFilter 并使用它而不是 [AllowAnonymous]

于 2013-10-08T14:35:23.423 回答
1

只是一些想法(实际上没有尝试过)。

  • 对于问题1 - 如果AccountCreated是一个动作,这意味着注册表单实际上发布到该 URL -它可以从外部访问。我建议您对其应用HttpPost属性,以便它只处理POST请求 - 您在这里无能为力
  • 对于第二点,您可以在您的操作方法中执行类似的操作
 if (HttpContext.User.Identity.IsAuthenticated)
            {
                return RedirectToAction("Index", "Home");
            }
else return View();
于 2013-10-08T14:48:58.077 回答
0

只是一个想法,当用户进入LoginRegister页面时注销用户。希望您没有在私人页面上提供任何链接供用户访问loginRegister 页面或检查用户是否已通过身份验证将其重定向到Home页面,坦率地说,您不能阻止用户编写URL并按下enter按钮,或者只是发出通知You'll be logged out if you proceed to whatever page.

于 2013-10-08T14:51:07.870 回答