ASP.NET Forms権限検証

9552 ワード

PDFダウンロード
安全性はASP.NET Webアプリケーションの重要な側面です.それは内容が非常に広範で、1つの文章の中ですべての安全規範を説明することができなくて、本文はどのようにFormsの認証を利用して安全なASPを構築するかを述べます.NETアプリケーションは、現在最も広く使用されている検証/認可方法です.
本文はASP.NET2.0 Forms認証での実装方法について説明します.読者は、ネット上でも専門書でも、このような文章をたくさん読んだことがあると信じています.最近ではWCFやASP.NET MVCのセキュリティモデルガイドによると、Webサイトのセキュリティ構築は常に時代遅れの話題であることがわかります.
本稿では、Webサイトのセキュリティ認証フレームワークを簡単な方法で一歩一歩説明し、レンガを投げて玉を引く役割を果たすことを目的としています.あなたが本文を見終わったとき、きっと収穫があると信じています.
まず、ルートディレクトリの下のwebを構成する必要がある.configファイル:
<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <system.web>

    <authentication mode="Forms">

      <forms name="SunnyWay"

             protection="All"

             timeout="30"

             loginUrl="~/Login.aspx"

             defaultUrl="~/"

             slidingExpiration="true"/>

    </authentication>

  </system.web>

</configuration>

要素のmodeプロパティは、アプリケーションのデフォルト認証モードを指定します(デフォルトはWindows).この属性は、次のいずれかの値になります.
Windows
Windows認証をデフォルトの認証モードとして指定します.基本、概要、統合Windows認証(NTLM/Kerberos)または証明書を使用して、Microsoftインターネット情報サービス(IIS)認証と組み合わせて使用します.この場合、アプリケーションは認証責任をベースIISに委任します.
Forms
ASP.NETフォームベースの認証は、デフォルトの認証モードとして指定されます.
Passport
Microsoft Passport Network認証をデフォルト認証モードとして指定します.
None
認証は指定されていません.アプリケーションは匿名のユーザーのみを期待します.そうしないと、独自の認証が提供されます.
次に、この例で使用する要素のプロパティを示します.詳細はMSDNを参照してください.
name
認証に使用するHTTP Cookieを指定します.1台のサーバ上で複数のアプリケーションを実行しており、各アプリケーションに一意のCookieが必要である場合は、各アプリケーションのWeb.configファイルでCookie名を設定します.デフォルトは「.ASPXAUTH」です.
protection
Cookieを保護するために、データ検証と暗号化方法を同時に使用するアプリケーションを指定します.このオプションは、machineKey要素に基づいて構成されたデータ検証アルゴリズムを使用します.トリプルDES(3 DES)が利用可能で、鍵が十分に長い(48ビット以上)場合、トリプルDESを使用して暗号化される.既定値(推奨値)はAllです.その他のオプション値(Encryption、None、Validation)の詳細はMSDNを参照してください
timeout
Cookieが期限切れになるまでの経過時間(整数分単位)を指定します.SlidingExpirationプロパティがtrueの場合、timeoutプロパティはスライド値であり、前のリクエストが受信された後の指定時間(分単位)で期限が切れます.パフォーマンスの危険を回避し、Cookie警告を開いたユーザーに複数のブラウザ警告を発行しないようにするために、指定した時間の大半が経過するとCookieが更新されます.これにより、精度が損なわれる可能性があります.既定値は30(30分)です.
loginUrl
有効な認証クッキーが見つからない場合、ログイン用のURLにリダイレクトするよう指定します.デフォルトはloginです.aspx.
defaultUrl
認証後にリダイレクトに使用するデフォルトのURLを定義します.この属性は.NET Framework 2.0の新しいプロパティ.デフォルトはdefault.aspxです.
slidingExpiration
調整可能な有効期限を指定します.可変期限切れCookieの現在の認証時間を、単一セッション中に各リクエストが受信されたときに期限切れにリセットします.デフォルトはtrueです.
次に、プロジェクトにフォルダメンバーを作成し、まずこのフォルダの下にwebを作成します.configファイル、内容は以下の通りです.
<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <appSettings/>

  <connectionStrings/>

  <system.web>

    <authorization>



    </authorization>

  </system.web>

</configuration>

このフォルダの下にあるすべてのリソースにアクセスするには、権限認証が必要です.この場合、認証は2つのケースに分けられます.
1.ログインユーザーであればアクセスできます.
2.アクセスできるのは、特定のユーザー・グループのメンバーである必要があります.
1つ目のケースでは、次の構成が必要です.
<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <appSettings/>

  <connectionStrings/>

  <system.web>

    <authorization>

      <deny users="?"/>

      <allow users="*"/>

    </authorization>

  </system.web>

</configuration>

この構成は、匿名ユーザの要求をすべてのユーザの要求から拒否することを意味する.この時点で/Member/defaultにアクセスする.aspxの場合、リクエストは拒否され、ルートディレクトリの下のwebに移行する.configファイルのノードのloginUrlプロパティで構成されているページ(この例ではLogin.aspx).
ロギンaspxでは、ユーザーログインの操作が実行されます.ユーザーのログインに成功した場合は、次のコードを使用してジャンプできます.
FormsAuthentication.RedirectFromLoginPage("           ", false);

すると、前にアクセスしたページに移動します.直接訪問するならaspxでは、ノードのdefaultUrlプロパティで構成されているページにページがジャンプします.
2つ目のケースでは、ログイン済みのユーザーではなく、Administrators、Usersなどの特定のユーザーグループのメンバーでなければアクセスできません.この場合は/Member/web.configでは、次のように構成されています.
<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <appSettings/>

  <connectionStrings/>

  <system.web>

    <authorization>

      <allow roles="Administrators,Users"/>

      <deny users="*"/>

    </authorization>

  </system.web>

</configuration>

この構成は、まずすべてのユーザーの要求を拒否し、Administrators、Usersユーザーグループに属するメンバーの要求を通過することを意味します.この時点で/Member/defaultにアクセスする.aspxの場合は、ログインだけでなく、ログインユーザーがAdministratorsまたはUsersユーザーグループに属している必要があります.そうしないと、リクエストは拒否され、ログインページに移動します.このとき、ログインページで実行するアクションは次のとおりです.
FormsAuthenticationTicket authTicket =

        new FormsAuthenticationTicket

        (

            0

            , "  "

            , DateTime.Now

            , chkRemember.Checked ? DateTime.Now.AddYears(1) : DateTime.Now.AddMinutes(30)

            , chkRemember.Checked ? true : false

            , "Administrators,Users"

        );

string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //  

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

Response.Cookies.Add(authCookie);

if (String.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))

{

    Response.Redirect(FormsAuthentication.DefaultUrl);

}

else

{

    Response.Redirect(Request.QueryString["ReturnUrl"]);

}

FormsAuthenticationTicketのクラスの説明:Forms認証でユーザーを識別するためのチケットのプロパティと値へのアクセスを提供します.
この例で使用するコンストラクション関数の各パラメータは、次のように説明されています.
int version、チケットのバージョン番号.string name、チケットに関連付けられたユーザー名.DateTime issueDate、チケット発行時のローカル日付と時間.DateTime expiration、チケットの有効期限が切れた場合のローカル日付と時間.bool isPersistentは、チケットが永続性Cookieに格納される場合(ブラウザセッション間で保存される場合)、trueである.そうでなければfalseです.チケットがURLに保存されている場合、この値は無視されます.string userData、チケットに格納されているユーザー固有のデータ.
この場合、暗号化された情報は既にCookieに格納、ウェブサイトのルートディレクトリの下にGlobalを作成する必要がある.asaxファイル、ファイルにApplication_を追加AuthenticateRequestイベントは、セキュリティモジュールが現在のユーザーの有効なアイデンティティを確立したときにトリガーされます.イベントコードは次のとおりです.
void Application_AuthenticateRequest(object sender, EventArgs e)

{

    //                   ,      。     ,          。 

    

    string cookieName = FormsAuthentication.FormsCookieName;

    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    FormsAuthenticationTicket authTicket = null;

    try

    {

        authTicket = FormsAuthentication.Decrypt(authCookie.Value);//  

    }

    catch (Exception ex)

    {

        return;

    }



    string[] roles = authTicket.UserData.Split(new char[] { ',' });//        ,      



    FormsIdentity id = new FormsIdentity(authTicket);



    System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);

    Context.User = principal;//  HttpContext.User 

}

アプリケーション_AuthenticateRequestイベントではCookieを復号しContextに値を与える.Userオブジェクト.そして、ページは、/Member/defaultへのアクセスを要求する.aspx、Contextが呼び出されます.UserオブジェクトのInRoleメソッドは、Istrueを返すとページ内容が表示され、falseを返すとログインページに移動します.
最後にContext.Userオブジェクトについて簡単に説明します.Context.UserはIPrincipalインタフェースのメンバーで、メソッドと属性があります.
IsInRole(string roleName)
現在のユーザーが指定したロールに属しているかどうかを確認します.
Identityプロパティ
現在のユーザーのIDを取得します.
メソッドIsInRoleとは、プロファイルにを指定し、対応するリソースにアクセスするときに呼び出すメソッドです.IdentityプロパティはIIDentityインタフェースのメンバーで、3つのプロパティがあります.
AuthenticationType
使用する認証のタイプを取得します.
IsAuthenticated
ユーザーが検証されたかどうかを示す値を取得します.
Name
現在のユーザーの名前を取得します.
これらの属性とメソッドは,ページ(Page)オブジェクトのUser属性を用いて呼び出すことができ,非常に便利である.
これで、ASP.NE Forms認証フレームワークは紹介済みで、あなたの仕事や勉強に役立つことを望んでいます.転載は出典を明記してください.