Asp.net-core-authorize-attribute

提供:Dev Guides
移動先:案内検索

ASP.NET Core-属性の承認

この章では、認証属性について説明します。 これまでのアプリケーションでは、匿名ユーザーが何でもできるようにしました。 従業員の詳細を編集し、詳細を表示できますが、新しい従業員を作成する機能はありません。 最初に作成機能を追加してから、Authorize属性を使用してユーザーアクセスを制限します。

*Views→Home* フォルダー内に新しいMVC Viewページを作成し、Create.cshtmlを呼び出して次のコードを追加することから始めます。
@model Employee
@{
   ViewBag.Title = "Create";
}
<h1>Create</h1>

@using (Html.BeginForm()) {
   <div>
      @Html.LabelFor(m => m.Name)
      @Html.EditorFor(m => m.Name)
      @Html.ValidationMessageFor(m => m.Name)
   </div>

   <div>
      <input type = "submit" value = "Save"/>
   </div>
}

次のプログラムに示すように、POSTとGETの両方のHomeControllerに* actionメソッド*を追加します。

[HttpGet]
public ViewResult Create() {
   return View();
}
[HttpPost]
public IActionResult Create(EmployeeEditViewModel model) {
   if (ModelState.IsValid) {
      var employee = new Employee();
      employee.Name = model.Name;
      var context = new FirstAppDemoDbContext();

      SQLEmployeeData sqlData = new SQLEmployeeData(context);
      sqlData.Add(employee);
      return RedirectToAction("Details", new { id = employee.Id });
   }
   return View();
}

次のプログラムに示すように、Index.cshtmlファイルに Create View へのリンクを追加しましょう。

@model HomePageViewModel
@{
   ViewBag.Title = "Home";
}
<h1>Welcome!</h1>

<table>
   @foreach (var employee in Model.Employees) {
   <tr>
      <td>@employee.Name
         <td>
            <a asp-controller = "Home" asp-action = "Details"
               asp-routeid = "@employee.Id">Details</a>

            <a asp-controller = "Home" asp-action = "Edit"
               asp-routeid = "@employee.Id">Edit</a>
         </td>
      </tr>
   }
</table>

<div>
   <a asp-action = "Create">Create</a>
</div>

アプリケーションを実行します。次のページが表示されます。

ページの作成

ホームページに、作成リンクが表示されます。 [作成]リンクをクリックすると、作成ビューに移動します。

リンクの作成

[名前]フィールドに名前を入力し、[保存]ボタンをクリックします。

名前の入力Jimmy

新しく追加された従業員の*詳細ビュー*が表示されます。 [ホーム]リンクをクリックします。

ようこそページ

このアプリケーションでは、すべてのユーザーが従業員を作成、編集でき、全員が詳細ビューを表示できます。 将来、匿名ユーザーがホームページで従業員のリストのみを見ることができるように、この動作を変更したいのですが、他のすべてのアクションでは、ユーザーが自分自身を識別してサインインする必要があります。 これを行うには、* Authorize属性*を使用します。

承認属性は、コントローラーまたはコントローラー内の個々のアクションに配置できます。

[Authorize]
public class HomeController : Controller {
  //....
}
  • Authorize属性をコントローラー自体に配置すると、authorize属性は内部のすべてのアクションに適用されます。
  • MVCフレームワークでは、ユーザーが認証チェックに合格しない限り、リクエストがこの属性で保護されたアクションに到達することはできません。
  • デフォルトでは、他のパラメーターを使用しない場合、Authorize属性が行う唯一のチェックは、ユーザーがログインしていることを確認するためのチェックです。
  • ただし、パラメーターを使用して、好みの凝ったカスタム許可ポリシーを指定できます。
  • AllowAnonymous 属性もあります。 この属性は、コントローラーのAuthorize属性を使用して内部のすべてのアクションを保護する場合に役立ちますが、この単一のアクションまたは保護を解除して匿名ユーザーが特定のアクションに到達できるようにする1つまたは2つのアクションがあります。
[AllowAnonymous]
public ViewResult Index() {
   var model = new HomePageViewModel();

   using (var context = new FirstAppDemoDbContext()) {
      SQLEmployeeData sqlData = new SQLEmployeeData(context);
      model.Employees = sqlData.GetAll();
   }
   return View(model);
}

アプリケーションでこれらの属性を試してみましょう。 実行中のアプリケーションでは、匿名ユーザーが従業員を編集できます。

従業員編集

これを変更し、従業員を編集する前にユーザーにログインして本人確認を強制する必要があります。 HomeControllerに進みましょう。 ここでは、1つまたは2つのアクションへのアクセスを制限します。 保護する特定のアクションにAuthorize属性をいつでも配置できます。 また、コントローラー自体にAuthorize属性を配置することもできます。このAuthorize属性はMicrosoft.AspNet.Authorization名前空間にあります。

ここで、Authorize属性を使用し、次のプログラムに示すように、ホームページを除き、ユーザーがこのコントローラーにアクセスするために自分自身を強制的に識別します。

[Authorize]
public class HomeController : Controller {
   [AllowAnonymous]
   public ViewResult Index() {
      var model = new HomePageViewModel();
      using (var context = new FirstAppDemoDbContext()) {
         SQLEmployeeData sqlData = new SQLEmployeeData(context);
         model.Employees = sqlData.GetAll();
      }
      return View(model);
   }
   public IActionResult Details(int id) {
      var context = new FirstAppDemoDbContext();
      SQLEmployeeData sqlData = new SQLEmployeeData(context);
      var model = sqlData.Get(id);

      if (model == null) {
         return RedirectToAction("Index");
      }
      return View(model);
   }
   [HttpGet]
   public IActionResult Edit(int id) {
      var context = new FirstAppDemoDbContext();
      SQLEmployeeData sqlData = new SQLEmployeeData(context);
      var model = sqlData.Get(id);

      if (model == null) {
         return RedirectToAction("Index");
      }
      return View(model);
   }
   [HttpPost]
   public IActionResult Edit(int id, EmployeeEditViewModel input) {
      var context = new FirstAppDemoDbContext();
      SQLEmployeeData sqlData = new SQLEmployeeData(context);
      var employee = sqlData.Get(id);

      if (employee != null && ModelState.IsValid) {
         employee.Name = input.Name;
         context.SaveChanges();
         return RedirectToAction("Details", new { id = employee.Id });
      }
      return View(employee);
   }
   [HttpGet]
   public ViewResult Create() {
      return View();
   }
   [HttpPost]
   public IActionResult Create(EmployeeEditViewModel model) {
      if (ModelState.IsValid) {
         var employee = new Employee();
         employee.Name = model.Name;
         var context = new FirstAppDemoDbContext();

         SQLEmployeeData sqlData = new SQLEmployeeData(context);
         sqlData.Add(employee);
         return RedirectToAction("Details", new { id = employee.Id });
      }
      return View();
   }
}

従業員のリストを表示するホームページまたは Index.cshtml ファイルには* AllowAnonymous属性*があります。 アプリケーションを実行しましょう。

AllowAnonymous属性

  • 開発者ツール*を開くF12キーを押します。 次に、[ネットワーク]タブに移動します。

ネットワークタブ

開発者ツールで見たいことがいくつかあるので、どのように機能するかを確認できます。 [編集]リンクをクリックすると、空白のページが表示されます。

リンクの編集

開発者ツールを見ると、サーバーから返されたHTTPステータスコードが* 401ステータスコード*であることがわかります。

401ステータスコード

401ステータスコードは、有効な認証資格情報が不足しているためにリクエストが許可されなかったことをブラウザに通知します。 これにより、Authorize属性が機能していることがわかります。

同様に、ホームページの[作成]リンクをクリックすると、次のスクリーンショットに示すものと同じエラーが表示されます。

同じエラー

  • ここで、悪い点は、ユーザーが空白のページに残されることであり、開発者ツールを開いていない限り、これが認証の問題であることを知らない可能性があります。
  • これは、Identityフレームワークが介入して支援できる場所です。
  • ユーザーがアクセスできないため、Identityフレームワークはアプリケーションの一部が401ステータスコードを返すことを検出できます。また、Identityフレームワークはそれをログインページに変換し、ユーザーがこの問題を回避できるようにします。
  • Identityフレームワークをインストールして構成すると、どのように機能するかがわかります。
  • しかし、現時点では、* Authorize属性*が機能していることがわかります。