我有一个使用Forms身份验证锁定的ASP.NET MVC站点。 web.config有
<authentication mode="Forms">
<forms defaultUrl="~/Account/LogOn" loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
除非用户通过身份验证,否则无法查看除帐户/登录以外的任何页面。
现在我正在尝试将PayPal IPN添加到我的网站,为了做到这一点,我需要有两个页面来处理PayPal的付款确认并感谢您的页面。这两个页面必须可供匿名用户使用。
我希望这些页面成为我的帐户控制器的控制器操作。有什么方法可以将属性应用于使匿名用户可以使用的特定操作方法吗?我在这里发现了几个尝试这样做的帖子,但大多数人都想要相反的情况。
基本上我希望may AccountController
class对大多数方法没有授权,除了少数几个。现在,看起来只有LogOn方法可供匿名用户使用。
答案 0 :(得分:13)
是的,你可以。在你的AccountController中,有一个[Authorize]属性,可以在类级别(限制整个控制器)或特定方法。
要限制特定操作,只需对处理这些操作的方法使用Authorize-attribute,并使控制器类不受限制。
以下是一些例子......希望有所帮助
要要求用户登录,请使用:
[Authorize]
public class SomeController : Controller
// Or
[Authorize]
public ActionResult SomeAction()
要限制特定角色的访问权限,请使用:
[Authorize(Roles = "Admin, User")]
public class SomeController : Controller
// Or
[Authorize(Roles = "Admin, User")]
public ActionResult SomeAction()
要限制特定用户的访问权限,请使用:
[Authorize(Users = "Charles, Linus")]
public class SomeController : Controller
// Or
[Authorize(Users = "Charles, Linus")]
public ActionResult SomeAction()
如您所见,您可以在类级别或方法级别使用该属性。你的选择!
答案 1 :(得分:4)
我认为没有可以应用于操作的“Unauthorize”属性,如果您不想在控制器中的所有操作上放置“[Authorize]”,请尝试以下操作:
以下是我能想到的两种方法:
之后
<system.web> stuff </system.web>
在web.config文件中,添加以下内容:
<location path="Account/ActionOne">
<system.web>
<authorization>
<allow users ="*" />
</authorization>
</system.web>
</location>
其中Account / ActionOne是您要授予匿名访问权限的操作方法的名称。对于第二个Action,复制上面的代码并将其粘贴到它之后并更改Action的名称。
我不确定这是否会因为MVC路由等原因而有效,但请试一试。
如果以前的解决方案不起作用,最好的办法是创建一个用Authorize属性修饰的基本控制器:
[Authorize]
public class AuthorizeControllerBase : Controller {}
然后让所有控制器继承它:
public class AccountController : AuthorizeControllerBase
{
// your actions etc.
}
这将使任何继承自AuthorizeControllerBase的控制器需要授权/登录才能调用任何方法。
然后您需要从web.config中删除
答案 2 :(得分:0)
默认情况下,不是保护您网站上的所有资源,而是寻找为个人资源提供匿名访问的方法,您可能最好采取相反的方法。不要在web.config中指定授权规则,然后使用授权过滤器(请参阅Mickel的答案)来保护单个控制器和/或操作。