asp.net core mvc権限制御:ビューでの操作権限制御


asp.net coree mvcでは、権限検証の枠組みを提供しています。前の文章では、権限制御の設定をどのように行うかを紹介しました。権限設定が終わったら、権限検証ロジックが自動的に実行されますが、場合によってはコードやビューに手動で権限を判断する必要があります。具体的な操作方法を紹介します。
コントローラの方法で現在のユーザが何らかの権限を持っているかどうかを判断したい場合は、直接にHttpContactext.User.Has Cliaimを使用して、string cliamtype、string cliamvalueを使用して判断し、この方法はbootlタイプに戻り、trueに戻って権限があることを示します。
ビューでは、ボタンやハイパーリンクを制御する権限が必要になります。権限のあるボタンを持っていると表示されます。そうでないと、現実的ではありません。どうすればこのような効果が得られますか?方法は以下の通りです。
1,ビューで直接にHttpContactext.User.Has Claaim(string cliamtype,string cliamvalue)を使用して権限を判断し、制御ボタンが表示されるかどうか

@if(HttpContext.User.HasClaim("User","Delete"))
{
<input type='button' value="  "/>
}
上のコードはビューに書いてあります。ユーザの削除権限があれば削除ボタンが表示されます。このような方式は、例えば検証が必要なところでは、このような形式で書きます。
2,asp.net core mvcの新しい特性を利用してtaghelperは第一の方法を簡略化できます。taghelperとは何ですか?そしてその役割はここでは紹介しません。BaiduまたはGoogle検索ができます。ここでは直接にどのようにカスタマイズ権限検証のtaghelperを紹介します。

<a asp-claim="goods,edit" asp-action="addgoods" asp-route-id="@goods.Id" class="btn-icon " title="  "><i class="icon-common-edit icon-pencil"></i></a>
上のコードは私達の最終的な効果です。このハイパーリンクはユーザーがclaim(type=goods、value=edit)権限を持っている時に表示されます。このtaghelperの実現方法を紹介します。
1)まずクラスを定義し、TagHelper類から派生し、claim属性の定義を追加し、View Contextを追加する。

class ClaimTagHelper:TagHelper
{
private const string ClaimAttributeName = "asp-claim";
    public ClaimTagHelper()
    {
    }
    [HtmlAttributeName(ClaimAttributeName)]
    public string Claim { get; set; }
}
2)私達の権限はtaghelperをコントロールして、buttonにしか運送できません。a、inputの要素にすべてHtml TarggetElementの特性を追加したいです。コードは以下の通りです。

[HtmlTargetElement("a", Attributes = ClaimAttributeName)]
  [HtmlTargetElement("button", Attributes = ClaimAttributeName)]
  [HtmlTargetElement("input", Attributes = ClaimAttributeName, TagStructure = TagStructure.WithoutEndTag)]
  public class ClaimTagHelper: TagHelper
{
......
}
3)TagHelperのProcess方法を書き換え、方法においてHttpContect.User.Has Cliaimを用いて権限判断を行う。ビューでHttpContectにアクセスするには、View Contectオブジェクトを借りる必要がありますので、現在のTagHelperクラスでView Contect引用を追加する必要があります。具体的なコードは以下の通りです。

public class ClaimTagHelper: TagHelper
{
.....

[HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; } 
.....
}
基本的な条件はすべて備えています。そして、Processが実現し、直接コードを付けます。

public override void Process(TagHelperContext context, TagHelperOutput output)
    {
      if (string.IsNullOrEmpty(Claim))
      {
        return;
      }
      string[] claimData = Claim.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
      if (claimData.Length == 1)
      {
        if (!ViewContext.HttpContext.User.HasClaim(m => m.Type == claimData[0]))
        {
          //   
          output.SuppressOutput();
        }
      }
      else
      {
        if (!ViewContext.HttpContext.User.HasClaim(m => m.Type == claimData[0] && m.Value == claimData[1]))
        {
          //   
          output.SuppressOutput();
        }
      }
}
ここで紹介しました。ありがとうございます。足りないところがあれば、ご指導を歓迎します。
以上が本文の全部です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてくれると同時に、私達を応援してください。