首先,按照您的操作方式,您的应用程序的安全性没有漏洞,它将按照您预期的方式运行。但是有更好的方法...
Authorize 属性的问题是很容易忘记您添加到应用程序的新控制器,如果您不添加它,您的控制器对公众开放。
如果您使用的是 MVC 4,则可以将 Authorize 属性添加为全局过滤器,然后在匿名控制器上使用 AllowAnonymous 属性,因为 Authorize 属性默认尊重 AllowAnonymous 属性。另一方面,MVC 3 不附带 AllowAnonymous 属性。吨
解决方法是在您的项目中自己创建 AllowAnonymous 属性,如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class AllowAnonymousAttribute : Attribute { }
现在,您可以从内置的 Authorize 属性进行子类化以自定义该属性并查找应用于您的控制器的 Anonymous 属性。如果找到该属性,则可以跳过授权。这是一个示例实现:
public sealed class AuthorizeWithAnonymousSupportAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
if (!skipAuthorization)
{
base.OnAuthorization(filterContext);
}
}
}
您必须将此属性添加到站点的全局过滤器中。在您的 Global.asax 中:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new AuthorizeWithAnonymousSupportAttribute ());
filters.Add(new HandleErrorAttribute());
}
现在,最后一步。您可以简单地将 AllowAnonymous 属性添加到您想要匿名的任何控制器:
[AllowAnonymous]
public class MyController : Controller
{
public Index()
{
}
public DoStuff()
{
}
etc...
}
执行上述所有操作的好处是您不必担心将 Authorize 属性添加到您添加到应用程序的控制器中。相反,您必须明确告诉应用程序哪些控制器对公众开放。
谢谢,希望这会有所帮助。