1

这个确切的问题已经在GitHub 上被问过了,但是提供的解决方法似乎对于版本 2 来说不是可选的。

问题是,如果安全配置正确,即使它是通过 ForAllControllersInheriting 配置的,它也不能与 CastleDynamixProxy 运行时创建的控制器代理一起使用。

我想这是由于当流利的安全性解析规则时这些控制器实际上并不存在。有什么解决方法吗?我想按照GitHub 上的建议创建自定义的 HandleSecurityAttribute ,但是我无法使用版本 2 中的所有内部内容来做到这一点(但这可能是我在 C# 方面不专业的原因,所以我可能只需要提示如何去做)。

我尝试了所有可能的配置:

configuration.ForAllControllersInAssembly(typeof(HomeController).Assembly)
    .DenyAnonymousAccess();
configuration.ForAllControllersInheriting<HomeController>().DenyAnonymousAccess();
configuration.ForAllControllers().DenyAnonymousAccess();

这些似乎都不适用于这个问题。

4

1 回答 1

2

对于那些仍然想知道如何解决这个问题的人,有一种方法可以在 SecurityHandler 的帮助下使用自定义的授权属性。

public class CastleProxyHandleSecurityAttribute : Attribute, IAuthorizationFilter
{

    private readonly ISecurityHandler securityHandler;

    public CastleProxyHandleSecurityAttribute()
    {
        securityHandler = new SecurityHandler();
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var actionName = filterContext.ActionDescriptor.ActionName;
        var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;

        if (controllerName.StartsWith("Castle") && filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.BaseType != null)
        {
            controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.BaseType.FullName;
        }

        var securityContext = SecurityContext.Current;
        securityContext.Data.RouteValues = filterContext.RouteData.Values;

        var overrideResult = securityHandler.HandleSecurityFor(controllerName, actionName, securityContext);
        if (overrideResult != null) filterContext.Result = overrideResult;
    }
}
于 2014-04-15T09:57:08.683 回答