ASP.Net MVC中仅允许匿名访问的属性

9

我知道当用户需要授权时有一个属性可以使用。你也可以在其上方放置[AllowAnonymous]。请参见下面的代码:

[Authorize] // only when the user is authorize
public class AccountController : Controller
{
    [HttpGet]
    [AllowAnonymous] // also when the user in not authorize.
    public ActionResult Login(string returnUrl = "")
    { /* Some code */ }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    { /* Some code */ }
}

但是否也有一个 仅允许匿名 的属性。例如:当用户未被授权时,登录页面才显示?


没有一个。而且没有一个的原因。 - Mark Homer
@MarkHomer:你能告诉我为什么没有一个吗? - H. Pauwelyn
为什么你想要阻止授权用户呢?这只会让设计变得很糟糕。 - Mark Homer
所以在您的控制器中检查用户是否已登录,如果是,则重定向到另一个操作。 - Mark Homer
我并没有问问题哈哈。在你的控制器中检查用户是否已经通过身份验证,然后重定向到另一个操作,你不需要装饰器,正如我在第一次说的一样,这是因为没有这样的一个装饰器。 - Mark Homer
显示剩余2条评论
1个回答

16

我认为目前没有现成的解决方案,但你完全可以自己动手制作。不过,我想指出的是,限制内容只对经过身份验证的用户开放似乎有些奇怪,因为这需要额外的努力。

public class AnonymousOnly : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
             // Do what you want to do here, e.g. show a 404 or redirect
        }
    }
}

然后只需使用这个新属性来装饰您的类/方法:

[AnonymousOnly]
public ActionResult Login(string returnUrl = "")
{
    // code
}

3
限制内容只供认证用户访问确实有些奇怪,但请注意认证用户可以前往登录和注册页面。当用户已经通过认证时,就不能再转到登录页面进行认证了。 - H. Pauwelyn
4
如果针对这两种情况,我会在方法内检查它们是否已经登录,并使用RedirectToAction而不是为一个方法创建一个新类。话虽如此,这完全取决于个人偏好,所以请按照您和您的团队的喜好来处理。 - ediblecode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接