如何在整个控制器上启用身份验证,并仅对某些操作方法禁用。我想要所有资源的身份验证。如果我写这样的东西:
[Authorize]
public class HomeController : BaseController
{
//This is public
[UnAuthorized]
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
//This is private resource
public ActionResult PrivateResource()
{
return View();
}
}
然后任何人都可以访问此资源。我需要这个,因为我们所有的资源都是私有的,很少有公共项目。你有任何想法如何让它变得更好吗?
答案 0 :(得分:3)
相应地整理您的控制器。为所有经过身份验证的资源都有一个基本控制器,您可以使用[Authorize]
属性进行注释,另一个用于公共资源。
[Authorize]
public abstract BaseAuthenticatedController : Controller
{ }
public abstract BaseController : Controller
{ }
答案 1 :(得分:1)
基于找到的解决方案here我编写了修复我想要的代码。
基于AuthorizeAttribute创建自定义授权属性并覆盖方法OnAuthorization:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext != null)
{
object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(false);
if (attributes != null)
{
foreach (var attribute in attributes)
if (attribute is UnAuthorizedAttribute)
return;
}
}
base.OnAuthorization(filterContext);
}
我在这里使用反射来识别具有UnAuthorized属性的动作。我不知道这种情况下的性能问题,但它完全解决了这个问题。