我正在使用自定义成员(member)提供程序。一切都很好。但是,在我的 web.config 文件中,我启用了“拒绝用户”,因此整个网站都被锁定了。
这很好用。用户被重定向到登录页面。
现在,我有一些 Controller /操作要允许匿名访问。关于页面、密码重置等
我能弄清楚如何做到这一点的唯一方法是解锁整个站点,将 [Authorize] 属性放在每个 Controller 上,并为我想要匿名的 Controller /操作删除它们。
这对我来说似乎倒退了。我更喜欢默认锁定所有内容并解锁匿名内容。
有解决办法吗?
谢谢!
最佳答案
我可以想到其他方法来实现这一点,但它们都涉及使用自定义的 AuthorizeAttribute。一种方法是让一个基本 Controller 使用所有 Controller 派生自的自定义 AuthorizeAttribute。这个属性将被定制以防止匿名(和未经授权的)访问一个 Action ,除非它是 Controller 或 Action 本身已经用另一个属性修饰——比如 AnonymousEnabledAttribute。您的所有 Controller 都将派生自该 Controller ,因此继承了它的标准“默认无匿名”行为。然后,您只需使用 AnonymousEnabledAttribute 装饰您希望匿名的 Controller /操作——为该 Controller 或操作提供覆盖。或者,对于 Controller ,根本不继承 protected Controller ,它的所有操作都会公开。
哦,您的整个网站必须保持开放。
[OverridableAuthorize]
public abstract class ProtectedController : Controller
{
}
public class MostlyProtectedController : ProtectedController
{
public ActionResult ProtectedAction()
{
}
[AnonymousEnabled]
public ActionResult PublicAction()
{
}
}
[AnonymousEnabled]
public class ExplicitlyPublicController : ProtectedController
{
// inherits additional behaviors, but anonymous is enabled by attribute
}
public class PublicByOmissionController : Controller
{
// doesn't inherit and is thus public -- assuming whole site is open
}
public class AnonymousEnabledAttribute : Attribute
{
}
public class OverridableAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext context )
{
context.HttpContext.Items["ActionDescriptor"] = context.ActionDescriptor;
base.OnAuthorize( context );
}
public override bool AuthorizeCore( HttpContextBase context )
{
var actionDescriptor = context.Items["ActionDescriptor"] as ActionDescriptor;
if (actionDescriptor == null)
{
throw InvalidOperationException( "ActionDescriptor missing from context" );
}
var attribute = actionDescriptor
.GetCustomAttributes( typeof(AnonymousEnabledAttribute,true)
.FirstOrDefault();
if (attribute == null)
{
return base.AuthorizeCore( context );
}
return true;
}
}
https://stackoverflow.com/questions/4629723/
相关文章:
jquery-ui - 如何设置jQueryUI Dialog for v1.8x的背景
authentication - cakephp 基于组的权限
ruby-on-rails - 有没有一种方法可以自定义页面上的 will_paginate 输出?
asp-classic - 我应该总是使用 connection.close
design-patterns - 访问者模式和编译器代码生成,如何获取子属性?
sql - 使用 T-SQL 的 SQL Server 中的 Cast 和 Convert 函数有什