ASP .NET MVC保护所有资源

时间:2010-04-01 07:02:12

标签: c# asp.net-mvc authentication

如何在整个控制器上启用身份验证,并仅对某些操作方法禁用。我想要所有资源的身份验证。如果我写这样的东西:

[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();
    }
}

然后任何人都可以访问此资源。我需要这个,因为我们所有的资源都是私有的,很少有公共项目。你有任何想法如何让它变得更好吗?

2 个答案:

答案 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属性的动作。我不知道这种情况下的性能问题,但它完全解决了这个问题。