如何允许匿名用户在MVC中访问某个特定页面?

39

我已经在我的ASP.NET MVC Web应用程序中启用了表单身份验证。我希望允许匿名用户仅访问某些特定页面,包括Register.cshtml等页面。我能够通过在根web.config中执行以下操作来允许从我的CSS文件访问:

<location path="Content/Site.css">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

现在我想允许其他页面,如主页和注册页面的匿名访问。有没有人知道如何实现这个?

2个回答

61

MVC通常使用[Authorize]属性来管理授权。被该属性修饰的控制器或单独的操作,需要用户被授权才能访问它们 - 其他所有操作都将对匿名用户可用。

换句话说,采用了黑名单方法,使用[Authorize]将需要授权的操作列入黑名单 - 所有未被该属性修饰的操作都可以访问。

更新:

MVC4引入了一个新的属性,即[AllowAnonymous]属性。与[Authorize]属性一起使用,现在可以采用白名单方法。通过将整个控制器使用[Authorize]属性进行修饰,可以强制要求所有操作都需要授权。然后,您可以使用[AllowAnonymous]属性,将不需要授权的特定操作列入白名单中。采用此方法,您可以确信不会意外地忘记为某个操作使用[Authorize]属性,从而使其对任何人都可用。

您的代码可能是这样的:

[Authorize]
public class UserController : Controller {

   [AllowAnonymous]
   public ActionResult LogIn () {
      // This action can be accessed by unauthorized users
   }

   public ActionResult UserDetails () {
      // This action can NOT be accessed by unauthorized users
   }
}

如果是这样,为什么我只启用表单身份验证就看不到我的Register.cshtml页面呢? - Johnson Duru
@JED 不确定,你可能需要补充更多的上下文才能解决这个问题。你是否遇到任何错误,或者当你尝试访问你的注册视图时会发生什么? - Christofer Eliasson
我认为我知道问题出在哪里了。我在我的配置文件中拒绝了所有用户的访问。 - Johnson Duru

17

在 Web.config 文件中,我有以下授权设置

<authorization>
    <deny users ="?"/>
</authorization>

这会导致

[AllowAnonymous]

不能正常工作,我不得不删除Web.config的授权,并在所有控制器中添加了以下代码。

[Authorize]

在类的声明之前,才能正常工作。


2
谢谢,这是唯一有效的方法!非常感谢。 - Mohamed Hamdaoui
1
不用谢,希望这些信息对更多的开发者有所帮助。 - Josue Morales

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