限制特定角色对站点的访问

本文关键字:站点 访问 定角色 | 更新日期: 2023-09-27 18:03:09

我有三个角色:Registered Users, Approved Users, and Admins.
只有Approved usersAdmins.可以访问该站点

为了限制匿名访问,我在FilterConfig中添加了一个过滤器,如下所示:

filters.Add(new System.Web.Mvc.AuthorizeAttribute());   

现在,对于注册用户,我希望他们重定向到一个登陆页面,上面写着:

请联系管理员批准您。

我不知道怎么做才是正确的。
我可以在每个控制器上设置授权属性,但我不确定这是不是一个好方法。
另外,我不确定应该在哪里指定基于角色的默认重定向操作。
我知道我可以在RouteConfig.cs中指定默认的重定向动作,但不确定在哪里指定角色。

限制特定角色对站点的访问

StanK是正确的,拥有[Authorize]属性将重定向所有未登录到登录页面的用户。这是你困境的一半。

从那里你需要改变你的logon方法来检查一个新登录的用户是否有正确的角色(例如ConfirmedUser)。这很棘手,因为User.IsInRole("ConfirmedUser")logon方法中总是为假。这是因为User对象是由http对象填充的,而http对象在下一次再循环之前不会被重新填充。幸运的是,您可以使用Roles.IsUserInRole(userName, "ConfirmedUser")来检查用户是否具有正确的角色。

因此,在您的logon方法中,在验证用户之后,将用户注销并将其重定向到[AllowAnonymous]方法,该方法通知他们尚未确认。

if (Roles.IsUserInRole(userName, "ConfirmedUser")
{
                FormsAuthentication.SignOut();
                return RedirectToAction("WarningMsg", "Home");
}

您应该能够为此使用[Authorize]属性。

限制页面的控制器或操作将使用[Authorize(Roles="Approved User,Admin")]装饰,注册用户的"登陆页面"将使用[Authorize(Roles="Registered User,Approved User,Admin")],登录操作将使用[AllowAnonymous]

如果用户未被授权,他们将被重定向到Account/Login。您需要在此操作中构建一些逻辑,将已经登录到您的登陆页面的"注册用户"重定向。其他人应该只看到标准的登录页面。

编辑

将"注册用户"从登录页重定向到登陆页的逻辑应该是这样的

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    if (User.Identity.IsAuthenticated && Roles.IsUserInRole("Registered User"))
        return RedirectToAction("LandingPage");
    ViewBag.ReturnUrl = returnUrl;
    return View();
}