3

ビューでカスタム AuthorizeAttribute クラスを使用してリンクを表示および非表示にする方法を理解しようと、しばらくの間掘り下げてきました。IsInRole からカスタム AuthorizeAttribute に移行するのは、特定のタスクの実行を許可するグループをエンド ユーザーが選択できるようにするためです。この時点まで、私は使用してきました:

        @{ if (HttpContext.Current.User.IsInRole("UserMgr"))
           { Html.ActionLink("Edit", "Edit", new { id = item.pkRecID }); }
        }

UserMgr はドメイン グループです。(これは機能しますが、私がする必要があることではありません)

次に、カスタム AuthorizeAttribute クラスを作成しました。

    public class isAuthorized : AuthorizeAttribute
{
    public string Access { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);

        string[] aszList = Access.Split(',');

        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
            return true;

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // Now id was specified => we do not allow access
            return false;
        }

        foreach (string szGroup in aszList) // check to see if user is in group
        {
            if (user.IsInRole(szGroup))
            {
                return true;
            }
        }

        return false;
    }

これはコントローラーで関数へのアクセスをブロックするために機能しますが、この関数を使用してビューでリンクを非表示にするにはどうすればよいですか?

ありがとう!

4

1 に答える 1

3

拡張メソッドを作成して、Cshtml ファイルの MvcHtmlStrings に適用できます。例:

public static IHtmlString If(this IHtmlString value, bool evaluation)
{
    return evaluation ? value : MvcHtmlString.Empty;
}

次に、html要素で次のように使用できます。

@Html.ActionLink("Reports", "Index", "Report").If(User.IsInRole("SuperAdmin"))

アップデート

手順:

  1. プロジェクトに新しい静的クラスを作成します。

  2. 提案された拡張メソッドを新しく作成されたクラスに追加します。

  3. この静的クラスをすべての cshtml ビューで使用できるようにするには、Views フォルダーにある webconfig に移動します。

  4. ここでも、web 構成がビュー フォルダーにあるように注意してください。アプリのルートにあるものは編集しないでください。

  5. 以下の例のように、静的クラスが配置されている名前空間を追加します。

    <system.web.webPages.razor>
      <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" /> 
        <add namespace="YourApplication.Utils"/>  <!-- THIS IS THE EXAMPLE ON HOW TO INSERT THE NAMESPACE THAT CONTAINS YOUR STATIC CLASS --> 
        <add namespace="Microsoft.Web.Helpers"/>
      </namespaces>
      </pages>
    </system.web.webPages.razor>
    

これよりもうまく説明できません。

于 2013-03-13T15:40:15.223 に答える