我在控制器上有一个授权属性,但我想在一个动作上将其关闭。 我创建了自己的授权过滤器,并在“角色”列表中添加了“匿名”。在我的过滤器中,如果Anonymous出现在角色列表中,则返回true。
但是,它似乎没有通过登录页面,就好像控制器授权正在抢占其他任何东西。
答案 0 :(得分:98)
您可以将[Authorize]
添加到控制器类,然后将[AllowAnonymous]
添加到您不希望获得授权的单个操作中。例如:
[Authorize]
public class AccountController : Controller
{
public ActionResult Profile()
{
return View();
}
[AllowAnonymous]
public ActionResult Login()
{
return View();
}
}
答案 1 :(得分:3)
您可以创建自己的属性版本。
有一个非常相似的问题,如何实现处理这种情况的自己的属性有一个非常好的答案。
Override Authorize Attribute in ASP.NET MVC
顺便说一下。您也可以创建默认具有授权的控制器。
<强>基强>
[Authorize]
public abstract class SecureControllerBase : Controller
{
}
<强>用法强>
public class MyController : SecureControllerBase
{
}
答案 2 :(得分:2)
我刚刚使用Azure ACS作为联合身份提供程序做了一个解决方案,并且接受的答案对我不起作用。对于那些正在挣扎的人,我的解决方案是完全绕过所需的控制器/视图的安全性。
为您需要绕过授权的操作创建新的Controller / Views。
在web.config中添加以下内容,
<location path="TheNameOfTheControllerYouWantToBypass">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
答案 3 :(得分:0)
只需将属性添加到要过滤的操作,而不是控制器类。如果控制器或其中一个基本控制器没有属性,则不会对操作进行修改,不会对其进行过滤。
答案 4 :(得分:-2)
不要在您的操作方法中添加AuthorizationAttribute,例如,您不需要。
我的自定义属性
public class AuthorizationFilterAttribute : AuthorizeAttribute
{
// Some code...
}
我的控制器
public class UserController : BaseController, IDisposable
{
[AuthorizationFilterAttribute]
public ActionResult UserList()
{
// Authorize attribute will call when this action is executed
}
public ActionResult AddUser()
{
// Authorize attribute will not call when this action is executed
}
}
我希望你明白我想说的是你。
============================更新后的答案============== ================== 强>
再创建一个属性,如下所示。
public sealed class AnonymousAttribute : Attribute { }
请将以下代码放在OnAuthorization方法上。
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool checkForAuthorization =
filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) ||
filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true);
if (!skipAuthorization)
{
base.OnAuthorization(filterContext);
}
}