2

次のようなものを使用して、cshtml ファイルで html 要素の可視性を切り替えることができる多くの例を見てきました。

if (User.IsInRole("Admin"))
{
    <input type="button" value="Save" />
}

ただし、次のようなものを実装することは可能ですか:

// User has update permission to User objects
User.HasPermission("User", "Update")
{
    <input type="button" value="Save" />
}

これらの両方を MVC アプリケーションで使用したいと思います。ロールは多数のアクセス許可に関連付けられており、アクセス許可はユーザーにも個別に付与できます。

これを行う 1 つの方法は、System.Security.Principal と System.Security.Identity を上書きし、Global.asax で Application_AuthenticateRequest メソッドを設定することです。

object user = HttpContext.Current.Cache.Get(authTicket.Name);

MyIdentity identity = new MyIdentity((MyUser)user, true);
MyPrincipal principal = new MyPrincipal(identity);
Context.User = principal;
Thread.CurrentPrincipal = principal;

そして、cshtml ファイルで次を使用します。

MyIdentity identity = (MyIdentity)User.Identity;
if (identity.User.HasClaim("User", "Update"))
{
    <input type="button" value="Save" />
}

このアプローチの問題は、許可を確認する必要があるすべての場所で MyIdentity へのキャストを行う必要があることです。

これを行うためのより良い、より効率的な方法はありますか? 私のターゲットは MVC3 または MVC4 です。

--

編集:

DavidG の提案に基づいて、拡張メソッドを調べ始めました。これは私が思いついたものです:

public static class PrincipalExtensions
{
    public static MyIdentity MyIdentity(this IPrincipal principal)
    {
        return principal.Identity as MyIdentity;
    }
}

でもどうやって使うの?いくつかの例では、web.config を変更したり、コントローラーと controllerFactory や global.asax コードをいじったりしているのを見ました。これまでのところ、cshtml ファイルで MyIdentity を使用できるようにはなっていません。

--

EDIT2:

さらなる進歩: ここの手順を使用しました: http://rizzo7.blogspot.fi/2012/04/mvc-30-razor-custom-principal-and.html

そして、それを手に入れました-一種の-機能しました。今、次のような構文を使用できます:

if (User.MyIdentity().User.HasClaim("User", "Update"))
{
    <input type="button" value="Save" />
}

ただし、Visual Studio では次のようなエラーが表示されます。

System.Security.Principal.IPrincipal' には 'MyIdentity' の定義が含まれておらず、タイプ 'System.Security.Principal.IPrincipal' の最初の引数を受け入れる拡張メソッド 'MyIdentity' が見つかりませんでした (using ディレクティブがないか、またはアセンブリ参照?)

ビューの Web.config には次のものがあります。

  <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="namespace.of.PrincipalExtensions"/>
  </namespaces>
</pages>

エラーにもかかわらず、プロジェクトは正しくコンパイルおよび実行されます。可視性チェックのたびにエラーが発生しながら開発とデバッグを行うのは大変なことです。これについて私にできることはありますか?

--

EDIT-ファイナル!

皆様、ありがとうございました。私自身が持っていた最後の質問にお答えします。cshtml が拡張クラスの名前空間を認識していることを確認する必要があります。:)

適切な場所から検索して、必要なものを最大限に提供してくれたので、DavidGの回答にマークを付けました。ありがとう!

4

1 に答える 1

3

拡張メソッドを使用して整理できます。

public static MyIdentity MyIdentity(this IPrincipal user)
{
    return (MyIdentity)User.Identity;
}

または HTML ヘルパー:

public static MyIdentity MyIdentity(this HtmlHelper helper)
{
    return (MyIdentity)User.Identity;
}
于 2014-10-22T13:08:53.103 に答える