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 の助けを借りて、カスタマイズされた authorizatin 属性を使用する方法があります。

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 に答える