1

私の .net mvc 4 アプリでは、アクションを保護するためにFluentSecurity (1.4) の最新リリースを使用しています。

私の問題を示す例を次に示します。

2 つの編集アクション (get と post) を持つコントローラーがあるとします。

    public class MyController : Controller
{
    //
    // GET: /My/

    public ActionResult Edit(decimal id)
    {
        var modelToReturn = GetFromDb(id);
        return View(modelToReturn);
    }

    [HttpPost]
    public ActionResult Edit(MyModel model)
    {
        Service.saveToDb(model);
        return View(model);
    }

}

ここで、アクションごとに異なるセキュリティ ポリシーを設定したいと考えています。そのために、(流暢なセキュリティを使用して) 以下を定義します。

    configuration.For<MyController>(x => x.Edit(0))
                                         .AddPolicy(new MyPolicy("my.VIEW.permission"));
    configuration.For<MyController>(x => x.Edit(null))
                                         .AddPolicy(new MyPolicy("my.EDIT.permission"));

最初の構成は get を参照し、2 番目の構成は post を参照します。なぜ私がダミー パラメータを送信しているのか疑問に思われる場合は、こちらこちらをご覧ください。

問題は、流暢なセキュリティがこれら 2 つの違いを見分けられないことです。したがって、これは機能しません。

それを克服する方法を見つけることができませんでした (アイデアは自由です)。新しい 2.0 ベータ リリースをインストールすることで、この問題を解決できるのではないかと考えています。

何か案は?

4

1 に答える 1

0

現在、FluentSecurity の各署名に異なるポリシーを適用することはできません。これは、FluentSecurity が ASP.NET MVC によって呼び出されるシグネチャを認識できないためです。知っているのはアクションの名前だけです。そのため、FluentSecurity は両方のアクション シグネチャを 1 つのアクションとして扱う必要があります。

ただし、複数のポリシーを同じアクションに適用できます (アクションごとに 1 つのポリシーに限定されません)。これにより、各ポリシーに Http 動詞フィルターを適用できます。以下は、それがどのように見えるかの例です:

1) 継承できる基本ポリシーを作成する

public abstract class HttpVerbFilteredPolicy : ISecurityPolicy
{
    private readonly List<HttpVerbs> _httpVerbs;

    protected HttpVerbFilteredPolicy(params HttpVerbs[] httpVerbs)
    {
        _httpVerbs = httpVerbs.ToList();
    }

    public PolicyResult Enforce(ISecurityContext securityContext)
    {
        HttpVerbs httpVerb;
        Enum.TryParse(securityContext.Data.HttpVerb, true, out httpVerb);

        return !_httpVerbs.Contains(httpVerb)
            ? PolicyResult.CreateSuccessResult(this)
            : EnforcePolicy(securityContext);
    }

    protected abstract PolicyResult EnforcePolicy(ISecurityContext securityContext);
}

2) カスタム ポリシーを作成する

public class CustomPolicy : HttpVerbFilteredPolicy
{
    private readonly string _role;

    public CustomPolicy(string role, params HttpVerbs[] httpVerbs) : base(httpVerbs)
    {
        _role = role;
    }

    protected override PolicyResult EnforcePolicy(ISecurityContext securityContext)
    {
        var accessAllowed = //... Do your checks here;
        return accessAllowed
            ? PolicyResult.CreateSuccessResult(this)
            : PolicyResult.CreateFailureResult(this, "Access denied");
    }
}

3) 現在のリクエストの HTTP 動詞を ISecurityContext の Data プロパティに追加し、アクションを保護します

SecurityConfigurator.Configure(configuration =>
{
    // General setup goes here...

    configuration.For<MyController>(x => x.Edit(0)).AddPolicy(new CustomPolicy("my.VIEW.permission", HttpVerbs.Get));
    configuration.For<MyController>(x => x.Edit(null)).AddPolicy(new CustomPolicy("my.EDIT.permission", HttpVerbs.Post));

    configuration.Advanced.ModifySecurityContext(context => context.Data.HttpVerb = HttpContext.Current.Request.HttpMethod);
});
于 2013-04-17T09:45:06.343 に答える