asp.NetForms認証の詳細

28853 ワード

サイトを作るときには、ユーザーがログインする機能が使われます.一部の敏感なリソースについては、許可されたユーザーのみがアクセスできることを望んでいます.これにより、ユーザーの認証が必要になります.初心者には、通常、ユーザ登録情報をセッションに格納しており、筆者はaspに触れたばかりである.Netの時はそうしました.私がユーザ情報をセッションに存在させると、セッションが失われてユーザが許可されたリソースに正常にアクセスできなくなり、ユーザのログイン状態を維持する際のセキュリティの問題、ユーザをログインページにナビゲートし続けるなどのわけのわからない問題に遭遇することが多い.
実はaspでNetでは、Forms認証によってユーザーを認証するより良い解決策があります.この方法では、ユーザーのログイン状態を簡単に維持できます(ユーザーがそうしたい場合)、便利なユーザーのライセンス構成、セキュリティの強化などのメリットがあります.くだらないことはもう言わないで、簡単なユーザー認証をします.
例を挙げる前に、次のユーザークラスを定義します.クラス名はSampleUserで、コードは次のとおりです.
    public partial class SampleUser
{
string username;
public string UserName
{
get { return username; }
set { username = value; }
}

string userpwd;
public string UserPWD
{
get { return userpwd; }
set { userpwd = value; }
}

public override bool Equals(object obj)
{
SampleUser other
= obj as SampleUser;
if (other == null || other.UserName != this.UserName)
return false;
return true;
}
}

public partial class SampleUser
{
public static List<SampleUser> userList = new List<SampleUser> {
new SampleUser() { UserName = "01", UserPWD = "123"},
new SampleUser() { UserName = "02", UserPWD = "123" },
new SampleUser() { UserName = "03", UserPWD = "123" },
new SampleUser() { UserName = "04", UserPWD = "123" },
};

public static SampleUser GetUser(string userName)
{
return userList.Find(u=>u.UserName == userName);
}
}

クラスSampleUserでは、ユーザーのログイン名とパスワード情報を格納するためのUserNameとUserPWDの2つのフィールドが定義されています.SampleUserクラスの別のセクションでは、データベースに格納されているユーザ情報の代わりに、ユーザ情報を取得する方法GetUserを提供するユーザの静的クラステーブルを提供します.
この例では、Webサイトのリソースにアクセスするにはログインする必要があることを示し、ログインしていない場合はloginにナビゲートする.aspxページにあります.
最初のステップはwebです.configに構成情報を追加し、WebサイトがForms認証を使用することを説明し、ログインページとデフォルトログインが成功した後のジャンプページを指定し、未ログインユーザーのアクセスを拒否するコードを次のように指定します.
    <authentication mode="Forms">
<forms loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" />
</authentication>
<authorization>
<deny users="?"/>
</authorization>

このステップが完了したら、Defaultを開きます.aspxページは、ログインしていない場合は、ページがLoginにナビゲートされます.aspxページでは、私たちの最初の目的はすでに達成されています.
2ステップ目は、Loginを完了します.aspxのページロジック.ページに2つのTextBoxコントロールを追加し、ユーザー名とパスワードを入力します.ログイン状態を維持するかどうかを選択するCheckBoxコントロールを追加します.ユーザーのログイン操作に応答するButtonコントロールを追加します.対応するコードは次のとおりです.
    <fieldset>
<legend> </legend>
<div>
<asp:TextBox ID="txtUserID" runat="server" Width="150" /><br /><br />
&nbsp;&nbsp;&nbsp;<asp:TextBox ID="txtUserPWD" runat="server" TextMode="Password" Width="150" /><br /><br />
<asp:CheckBox ID="cbSaveUserName" runat="server" Checked="true" Text=" " />
</div><br />
<asp:Literal ID="ltMessage" Text="" runat="server" Visible="false" />
<br />
<p>
<asp:Button ID="btnLogin" Text=" " runat="server" OnClick="btnLogin_Click" />
</p>
</fieldset>

次に、バックグラウンドコードを完了し、ログインボタンのバックグラウンド処理方法を追加します.ユーザー名とパスワードを検証し、検証が通過した場合、ユーザー名に認証手形を作成し、応答するCookieに追加します.コードは次のとおりです.
        protected void btnLogin_Click(object sender, EventArgs e)
{
string userID = this.txtUserID.Text.Trim();
string userPWD = this.txtUserPWD.Text.Trim();

SampleUser userEx
= SampleUser.GetUser(userID);
if (userEx == null)
{
ltMessage.Text
= "";
ltMessage.Visible
= true;
return;
}

if (userEx.UserPWD != userPWD)
{
ltMessage.Text
= " , !";
ltMessage.Visible
= true;
return;
}

// ,
FormsAuthentication.RedirectFromLoginPage(userEx.UserName, this.cbSaveUserName.Checked);
}

このステップを完了すると、簡単なFroms検証機能が完了しました.プログラムを実行すると、ここに問題があることに気づきます!!!
気づいたか?loginにナビゲートするとaspxの時、このページのスタイルが失われました!これは、私たちがウェブサイト全体のリソースにアクセス制限を行ったためで、ログインしなければ、ユーザーはアクセスできないだけではありません.aspxページは、cssファイル、jsファイルにもアクセスできません.明らかに、これらのリソースは敏感なリソースではないので、これは私たちが望んでいるものではありません.通常、Webサイト全体ではなく、一部のフォルダ内のファイルに対してのみアクセス制限を検証したい場合があります.たとえば、このフォルダに保存されているのはユーザーの個人情報であり、これらの情報は敏感であるため、Userフォルダの下のページにのみアクセス制限を許可します.これはどのように実現すればいいのでしょうか.
プレゼンテーションのディレクトリ検証を完了するために、プロジェクトにUserフォルダを追加し、UserInfoを追加します.aspx、 UserLogin.aspxの2ページです.UserInfo.aspxはユーザー情報を表示するために使用されています.そのビジネスロジックは私たちが関心を持っているわけではありません.UserLogin.aspxページはユーザーをログインさせるために使用され、コードとLogin.aspxページはほぼ同じです.
第一歩:Webを修正するconfigファイルで、匿名のユーザーがシステムリソースにアクセスできるようにします.
    <authorization>
<allow users="?"/>
</authorization>

ステップ2:Userフォルダの下にWebを追加します.configファイル、コードを変更し、匿名のユーザーがフォルダの下のリソースにアクセスすることを拒否します.
      <authorization>
<deny users="?"/>
</authorization>

この2つのステップが完了したら、UserInfoにアクセスします.aspxの場合、ログインしていなければ~/User/UserLoginにナビゲートする.aspxページは、登録すると~/User/UserInfoにナビゲートされる.aspxページ.この場合、私たちのログインページのスタイルは失われていません.これは私たちのプロファイルが機能していることを示しています.
次はUserInfoでaspxページには、ログインしたユーザーのユーザー名とパスワードが表示されます(ここでは、ログインしたユーザーデータを取得する方法を示すために行われていますが、通常、ユーザーのパスワードは表示されません).ログイン後、ユーザーの手形情報は暗号化されてCookieに保存され、この手形にはログインしたユーザーの名前情報があり、手形のユーザー名を取得することで、完全なユーザー情報を取得することができます.
ユーザー情報を表示するには、次のように2つのLabelコントロールをページに配置します.
<h2>
<p><asp:Label ID="lblUserName" Text="" runat="server" /></p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<asp:Label ID="lblUserPWD" Text="" runat="server" /></p>
</h2>

次に、ページのLoadメソッドで、ユーザー情報を取得して表示します.
if (this.Context.User != null && this.Context.User.Identity != null && this.Context.User.Identity.IsAuthenticated)
{
SampleUser user
= SampleUser.GetUser(this.Context.User.Identity.Name);
if (user != null)
{
this.lblUserName.Text = user.UserName;
this.lblUserPWD.Text = user.UserPWD;
}
}

私たちのコードを再実行し、ユーザーがログインした後(ログイン状態を維持すれば、ブラウザをオフにして再開しても)、ログインしたユーザーのNameを取得して、ユーザーのオブジェクトを取得することができます.
ログインを終了するには、Cookieに保存されているチケット情報を削除するだけでいいです.この機能Forms検証は完了しました.コードは簡単です.
FormsAuthentication.SignOut();  //    

本稿では、プロファイルでロールを指定する方法が柔軟ではないため、ロールの検証には触れません.ロールがプログラムで維持できる場合、ここでの指定は虚構です.興味のある友达は自分で勉強することができて、複雑ではありません.本明細書の最後に、詳細なForms検証をWebに添付する.configの構成説明:
  <forms 
name="name"
loginUrl
="URL"
defaultUrl
="URL"
protection
="[All|None|Encryption|Validation]"
timeout
="[MM]"
path
="path"
requireSSL
="[true|false]"
slidingExpiration
="[true|false]">
enableCrossAppRedirects="[true|false]"
cookieless="[UseUri|UseCookie|AutoDetect|UseDeviceProfile]"
domain="domain name"
ticketCompatibilityMode="[Framework20|Framework40]">
<credentials>...</credentials>
</forms>
  • name:認証に使用するHTTP Cookieを指定します.1台のサーバ上で複数のアプリケーションを実行しており、各アプリケーションに一意のCookieが必要である場合は、各アプリケーションのWeb.configファイルでCookie名を設定します.デフォルトは「.ASPXAUTH」です.
  • loginUrl:有効な認証Cookieが見つからない場合、ログイン用のURLにリダイレクトするように指定します.デフォルトはloginです.aspx.
  • defaultUrl:認証後にリダイレクトに使用するデフォルトのURLを定義します.デフォルトはdefault.aspxです. 
  • protection:
    Cookieが使用する暗号化タイプ(ある場合)を指定します.デフォルトはAllです.
  • timeout:Cookieが期限切れになるまでの経過時間(整数分単位)を指定します.SlidingExpirationプロパティがtrueの場合、timeoutプロパティはスライド値であり、前のリクエストが受信された後の指定時間(分単位)で期限が切れます.パフォーマンスの危険を回避し、Cookie警告を開いたユーザーに複数のブラウザ警告を発行しないようにするために、指定した時間の大半が経過するとCookieが更新されます.これにより、精度が損なわれる可能性があります.既定値は30(30分)です. 
  • path:アプリケーションから発行されたCookieのパスを指定します.デフォルト値はスラッシュ(/)です.これは、ほとんどのブラウザが大文字と小文字を区別しているためです.パスの大文字と小文字が一致しない場合、ブラウザはCookieに戻りません.
  • requireSSL:認証Cookieを転送するためにSSL接続が必要かどうかを指定します.デフォルトはFalseです. 
  • slidingExpiration:調整可能な有効期限を指定します.可変期限切れCookieの現在の認証時間を、単一セッション中に各リクエストが受信されたときに期限切れにリセットします.デフォルトはTrueです.
  • enableCrossAppRedirects:認証されたユーザーが他のWebアプリケーションのURLにリダイレクトされるかどうかを示します.デフォルトはFalseです. 
  • cookieless:CookieとCookieの動作を使用するかどうかを定義します.デフォルト値はUseDeviceProfile.
  • domain:送信Forms認証Cookieで設定したオプションドメインを指定します.この設定はhttpCookies要素で使用されるドメインよりも優先されます.デフォルトは空の文字列("")です.
  • ticketCompatibilityMode:Forms認証でチケットの有効期限に対して調整ワールドを使用する場合(UTC)またはローカル時間を指定します.デフォルトはFramework 20です.

  • サブエレメント
    credentials:
       
       
                      ,      (    )     。