Asp.net-mvc-security

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

ASP.NET MVC-セキュリティ

この章では、アプリケーションにセキュリティ機能を実装する方法について説明します。 また、ASP.NETに含まれており、ASP.NET MVCから使用できる新しいメンバーシップ機能についても説明します。 ASP.NETの最新リリースでは、次の方法でユーザーIDを管理できます-

  • SQLデータベース *ローカルWindowsアクティブディレクトリ

また、この章では、ASP.NETの一部である新しいIDコンポーネントと、ユーザーとロールのメンバーシップをカスタマイズする方法についても説明します。

認証

ユーザーの認証とは、ユーザーの身元を確認することです。 これは本当に重要です。 明らかな理由により、認証されたユーザーにのみアプリケーションを提示する必要がある場合があります。

新しいASP.Net MVCアプリケーションを作成しましょう。

新しいMVCアプリケーション

OKをクリックして続けます。

新しいASP.NETアプリケーションを起動するとき、プロセスの手順の1つは、アプリケーションのニーズに合わせて認証サービスを構成することです。

MVCテンプレートを選択すると、[認証の変更]ボタンが有効になっていることがわかります。

認証ボタンが有効

これは、[新しいプロジェクト]ダイアログに表示される[認証の変更]ボタンで行います。 デフォルトの認証は、個人ユーザーアカウントです。

認証オプション

[変更]ボタンをクリックすると、次の4つのオプションのダイアログが表示されます。

認証なし

最初のオプションは認証なしです。このオプションは、訪問者が誰であるかを気にしないWebサイトを構築する場合に使用されます。

認証なし

誰でも利用でき、すべての人がすべてのページとして接続します。 これは後からいつでも変更できますが、認証なしオプションは、Webサイトにアクセスするユーザーを識別する機能がないことを意味します。

個々のユーザーアカウント

2番目のオプションは個人ユーザーアカウントであり、これはユーザーがWebサイトにアクセスできる従来のフォームベースの認証です。 登録、ログインの作成が可能です。デフォルトでは、ユーザー名はいくつかの新しいASP.NET ID機能を使用してSQL Serverデータベースに保存されます。

個人ユーザーアカウント

パスワードもデータベースに保存されますが、最初にハッシュされます。 パスワードはハッシュ化されているため、データベースにあるプレーンテキストのパスワードを心配する必要はありません。

このオプションは通常、ユーザーのIDを確立するインターネットサイトで使用されます。 ユーザーがサイトのパスワードを使用してローカルログインを作成できるようにすることに加えて、Microsoft、Google、Facebook、Twitterなどのサードパーティからのログインを有効にすることもできます。

これにより、ユーザーは自分のLiveアカウントまたはTwitterアカウントを使用してサイトにログインでき、ローカルユーザー名を選択できますが、パスワードを保存する必要はありません。

これは、このモジュールで時間を費やすオプションです。個々のユーザーアカウントオプション。

仕事と学校のアカウント

3番目のオプションは、組織アカウントを使用することです。これは通常、Active Directoryフェデレーションサービスを使用するビジネスアプリケーションに使用されます。

職場のアカウント

Office 365をセットアップするか、Azure Active Directory Servicesを使用し、内部アプリとクラウドアプリにシングルサインオンします。

また、Azureベースの場合、アプリをWindows Azure管理ポータルに登録する必要があるため、アプリIDを提供する必要があります。アプリIDは、登録される可能性のあるすべてのアプリケーションの中でこのアプリケーションを一意に識別します。

Windows認証

4番目のオプションはWindows認証で、イントラネットアプリケーションに適しています。

Windows認証

ユーザーはWindowsデスクトップにログインし、同じファイアウォール内にあるアプリケーションに対してブラウザーを起動できます。 ASP.NETは、Active Directoryによって確立されたユーザーのIDを自動的に取得できます。 このオプションは、サイトへの匿名アクセスを許可しませんが、これも変更可能な構成設定です。

フォームベースの認証を見てみましょう。名前は個人ユーザーアカウントです。 このアプリケーションは、ユーザー名とパスワード、古いパスワードをローカルのSQL Serverデータベースに保存し、このプロジェクトが作成されると、Visual StudioはNuGetパッケージも追加します。

フォームベース認証

次に、このアプリケーションを実行します。このアプリケーションに初めてアクセスすると、匿名ユーザーになります。

匿名ユーザー

まだログインできるアカウントがないため、このサイトで登録する必要があります。

[登録]リンクをクリックすると、次のビューが表示されます。

リンクの登録をクリック

メールIDとパスワードを入力します。

EmailIdパスワードの入力

登録をクリックします。 これで、アプリケーションはあなたを認識します。

登録をクリック

あなたの名前を表示することができます。 次のスクリーンショットでは、こんにちは、muhammad.waqas @ outlook.comを見ることができます! 表示されています。 これをクリックすると、パスワードを変更できるページへのリンクになります。

名前を表示

また、ログオフ、シャットダウン、再起動、1週間後に戻ることができ、以前に使用した資格情報でログインできるはずです。 ログオフボタンをクリックすると、次のページが表示されます。

ログオフボタンをクリック

[ログイン]リンクをもう一度クリックすると、次のページに移動します。

ログインリンクをクリック

同じ資格情報で再度ログインできます。

この点に到達するために、多くの作業が舞台裏で行われています。 ただし、私たちがやりたいのは、各機能を調べて、このUIがどのように構築されるかを確認することです。 ログオフとログインプロセスの管理とは何ですか? この情報はデータベースのどこでソートされますか?

いくつかの簡単な基本から始めましょう。 最初に、このユーザー名がどのように表示されるかを確認します。 ソリューションエクスプローラーのView/Sharedフォルダーから_Layout.cshtmlを開きます。

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "utf-8"/>
      <meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
      <title>@ViewBag.Title - My ASP.NET Application</title>
      @Styles.Render("~/Content/css")
      @Scripts.Render("~/bundles/modernizr")
   </head>

   <body>
      <div class = "navbar navbar-inverse navbar-fixed-top">
         <div class = "container">

            <div class = "navbar-header">
               <button type = "button" class = "navbar-toggle" datatoggle = "collapse"
                  data-target = ".navbar-collapse">
                     <span class = "icon-bar"></span>
                     <span class = "icon-bar"></span>
                     <span class = "icon-bar"></span>
               </button>

               @Html.ActionLink("Application name", "Index", "Home", new
               { area = "" }, new { @class = "navbar-brand" })
            </div>

            <div class = "navbar-collapse collapse">
               <ul class = "nav navbar-nav">
                  <li>@Html.ActionLink("Home", "Index", "Home")</li>
                  <li>@Html.ActionLink("About", "About", "Home")</li>
                  <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
               </ul>

               @Html.Partial("_LoginPartial")
            </div>

         </div>

      </div>
      <div class = "container body-content">
         @RenderBody()
         <hr/>
         <footer>
            <p>© @DateTime.Now.Year - My ASP.NET Application</p>
         </footer>
      </div>

      @Scripts.Render("~/bundles/jquery")
      @Scripts.Render("~/bundles/bootstrap")
      @RenderSection("scripts", required: false)

   </body>
</html>

共通のナビゲーションバー、アプリケーション名、メニューがあり、_loginpartialと呼ばれるレンダリングされている部分ビューがあります。 実際には、ユーザー名または登録名とログイン名を表示するビューです。 したがって、_loginpartial.cshtmlも共有フォルダーにあります。

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated) {
   using (Html.BeginForm("LogOff", "Account", FormMethod.Post,
      new { id = "logoutForm", @class = "navbar-right" })){
         @Html.AntiForgeryToken()
         <ul class = "nav navbar-nav navbar-right">
            <li>
               @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!",
               "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
            </li>

            <li>
               <a href = "javascript:document.getElementById('logoutForm').submit()">Logoff</a>
            </li>

         </ul>
      }
}else{
   <ul class = "nav navbar-nav navbar-right">
      <li>@Html.ActionLink("Register", "Register", "Account", routeValues:
         null, htmlAttributes: new { id = "registerLink" })</li>

      <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null,
         htmlAttributes: new { id = "loginLink" })</li>
   </ul>
}

上記のように、if/elseステートメントがあります。 リクエストが認証されていないため、ユーザーが誰なのかわからない場合、このビューには登録リンクとログインリンクが表示されます。 ユーザーは、リンクをクリックしてログインまたは登録できます。 これはすべて、アカウントコントローラーによって行われます。

ここでは、ユーザー名を取得する方法を確認します。これはRequest.IsAuthenticated内にあります。 User.Identity.GetUserNameの呼び出しを確認できます。 ユーザー名を取得します。この場合は「muhammad.waqas@outlook.com」です

承認

認証されていないユーザーから保護したい何らかの情報があるとしましょう。 そのため、ユーザーがログインしている場合にのみ、その情報を表示する新しいコントローラーを作成しましょう。

コントローラーフォルダーを右クリックし、追加→コントローラーを選択します。

ログインしているユーザー

MVC 5コントローラーを選択します-コントローラーを空にして、「追加」をクリックします。

SecretControllerという名前を入力し、「追加」ボタンをクリックします。

SecretController

次のコードに示すように、内部に2つのアクションがあります。

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   public class SecretController : Controller{
     //GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

このアプリケーションを実行すると、次のスクリーンショットに示すように、認証なしでこの情報にアクセスできます。

秘密の情報はこちら

したがって、認証されたユーザーのみがSecretアクションメソッドにアクセスでき、PublicInfoは認証なしで誰でも使用できます。

この特定のアクションを保護し、認証されていないユーザーがここに到着しないようにするには、Authorize属性を使用できます。 他のパラメーターのないAuthorize属性は、ユーザーのIDが既知であり、匿名ユーザーではないことを確認します。

//GET: Secret
[Authorize]
public ContentResult Secret(){
   return Content("Secret informations here");
}

このアプリケーションを再度実行して、同じURL* http://localhost:54232/Secret/Secret *を指定します。 MVCアプリケーションは、アプリケーションの特定の領域にアクセスできないことを検出し、ログインページに自動的にリダイレクトします。ログインページでは、ログインしてアプリケーションのその領域に戻ろうとする機会が与えられます。あなたが拒否された場所。

ログインページの自動リダイレクト

戻りURLで指定されていることがわかります。これは、ユーザーが正常にログインした場合に/secret/secretにリダイレクトすることをこのページに本質的に伝えます。

資格情報を入力し、[ログイン]ボタンをクリックします。 そのページに直接移動することがわかります。

秘密の情報はこちら

ホームページに戻ってログオフすると、シークレットページにアクセスできません。 再度ログインするように求められますが、/Secret/PublicInfoにアクセスすると、認証されていない場合でもそのページを見ることができます。

ここで公開情報

そのため、ほとんどすべてが認証を必要とするコントローラー内にいるときに、すべてのアクションに認証を配置したくない場合。 その場合、このフィルターをコントローラー自体にいつでも適用でき、このコントローラー内のすべてのアクションではユーザーの認証が必要になります。

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   [Authorize]
   public class SecretController : Controller{
     //GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

ただし、アクションを本当に開きたい場合は、この許可ルールを別の属性AllowAnonymousで上書きできます。

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   [Authorize]
   public class SecretController : Controller{
     //GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      [AllowAnonymous]
      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

このアプリケーションを実行すると、ログインして/Secret/PublicInfoにアクセスできますが、他のアクションには認証が必要です。

ここで公開情報

匿名ユーザーは、この1つのアクションのみに許可されます。

Authorize属性を使用すると、特定のユーザーにこのアクションを許可するなど、いくつかのパラメーターを指定することもできます。

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   [Authorize(Users = "ali.khan@outlook.com")]
   public class SecretController : Controller{
     //GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      [AllowAnonymous]
      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

このアプリケーションを実行して/secret/secretにアクセスすると、このコントローラーの適切なユーザーではないため、ログインを求められます。

Go to Secret