[.NETロールベースセキュリティ検証]の3:ASP.NET Forms認証



[.NETロールベースセキュリティ検証]の3:ASP.NET Forms認証


[2006-08-08 11:11:56|作者:yuhen]
サイズ:大|中|小
開発の過程で、私たちがしなければならないことは次のとおりです.
1.web.configでForms認証関連パラメータを設定します.
2.ログインページを作成します.
ログイン・ページのアクションは次のとおりです.
1.ユーザー名とパスワードが正しいことを確認します.
2.認証チケット・オブジェクトを作成します.
3.認証チケットオブジェクトを文字列に暗号化し、Cookiesに書き込みます.
4.元の要求URLにリダイレクトします.
1.簡単なプレゼンテーション
web.config
<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true"/>
        <authentication mode="Forms">
            <forms loginUrl="~/logon.aspx" name="MyAuthForm">
                <credentials passwordFormat="Clear">
                    <user name="username" password="password"/>
                </credentials>
            </forms>
        </authentication>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</configuration>

logon.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (FormsAuthentication.Authenticate(this.txtUsername.Text, this.txtPassword.Text))
            FormsAuthentication.RedirectFromLoginPage(this.txtUsername.Text, true);
        else
            Response.Write("        !");
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>   </title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Username: <asp:TextBox ID="txtUsername" runat="server" Width="100px" Text="username"></asp:TextBox><br />
        Password: <asp:TextBox ID="txtPassword" runat="server" Width="100px" Text="password"></asp:TextBox><br />
        <asp:Button ID="Button1" runat="server" Text="Sign In" OnClick="Button1_Click" />
    </div>
    </form>
</body>
</html>

2.Forms検証パラメータ
一部のサブディレクトリのページアクセス要求のみが認証を必要とする場合は、ルートパスの下のwebを変更することができる.config.
web.config
<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true"/>
        <authentication mode="Forms">
            <forms loginUrl="~/logon.aspx" name="MyAuthForm">
                <credentials passwordFormat="Clear">
                    <user name="username" password="password"/>
                </credentials>
            </forms>
        </authentication>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</configuration>

認証が必要なサブディレクトリに新しいwebを作成します.config.
<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</configuration>

ルートパスの下のwebもできますconfigでは、認証モードを制御するために関連パラメータを指定します.
cookieless 
           Cookie    Cookie    。
    .UseCookies 
                        Cookie。
    .UseUri 
               Cookie。
    .AutoDetect 
                   Cookie,      Cookie;      Cookie。
    .UseDeviceProfile 
                Cookie,      Cookie;      Cookie。 
             Cookie    ,                Cookie   。
 
defaultUrl 
                      URL。      "default.aspx"。
                   ,        。

loginUrl 
                     Cookie,              URL。     login.aspx。
 
name 
               HTTP Cookie。                             
        Cookie,            Web.config       Cookie   。     ".ASPXAUTH"。
 
path 
             Cookie     。 
           (/),                 ,          ,        Cookie。
 
timeout 
       Cookie         (        )。    Cookie    。     "30"(30   )。

詳細については、MSDNドキュメントを参照してください.
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/dv_ASPNETgenref/html/8163b8b5-ea6c-46c8-b5a9-c4c3de31c0b3.htm
<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true"/>
        <authentication mode="Forms">
            <forms loginUrl="~/logon.aspx" name="MyForm" defaultUrl="index.aspx" timeout="10">
                <credentials passwordFormat="Clear">
                    <user name="username" password="password"/>
                </credentials>
            </forms>
        </authentication>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</configuration>

3.検証方法
次の4つの方法のうちの1つを用いてチケットの書き込みとリダイレクト操作を行うことができますが、実は前の3つは4つ目の方法のパッケージにすぎません.1、4がおすすめです.次の3つの方法では、cookieless="UseUri"はサポートされていません.
// 1.           
FormsAuthentication.RedirectFromLoginPage("username", true);

// 2.           
FormsAuthentication.SetAuthCookie("username", false);
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));

// 3.           
Response.Cookies.Add(FormsAuthentication.GetAuthCookie("username", false));
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));

// 4.            
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "username", DateTime.Now, DateTime.Now.AddMinutes(10), false, null);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)));
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));

4.カスタムIDタイプ
MSDNドキュメントはGlobalにあることを示しています.Asaxでは、GenericPrincipal、FormsIdentityの代わりにAuthenticateイベントを使用してカスタムPrincipal、Identityを使用します.AuthenticateイベントはAuthenticateRequestイベント中に開始されるため、他のモジュールの前にユーザ識別オブジェクト(FormsAuthenticationEventArgs.User)を作成できます.
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref12/html/T_System_Web_Security_FormsAuthenticationEventHandler.htm
class MyPrincipal : System.Security.Principal.IPrincipal
{
    // ...
}

class MyIdentity : System.Security.Principal.IIdentity
{
    // ...
}
    
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
    if (FormsAuthentication.CookiesSupported)
    {
        if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
        {
            try
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
                    Request.Cookies[FormsAuthentication.FormsCookieName].Value);
        
                args.User = new MyPrincipal(new MyIdentity (ticket), new string[0]);
            }
            catch (Exception e)
            {
                // Decrypt method failed.
            }
        }
    }
    else
    {
        throw new HttpException("Cookieless Forms Authentication is not " +
            "supported for this application.");
    }

}

もちろん、もう一つの簡単な方法があります.
if (!(HttpContext.Current.User is MyPrincipal))
{
    HttpContext.Current.User = new MyPrincipal(new MyIdentity(ticket), roles);
}

ただ、適当なタイミングを探しているだけです.
5. FormsAuthentication
Authenticate
アプリケーションプロファイルに格納されている認証情報と照合して、ユーザー名とパスワードを検証します.この方法は、webに格納されていることを検証するしかない.configのユーザー名とパスワード情報は、ほとんどの場合、独自の検証方法で置き換えられます.
Decrypt
Cookieから取得した暗号化文字列を復号し、FormsAuthenticationTicketオブジェクトを作成します.
Encrypt
FormsAuthenticationTicketを暗号化し、暗号化された文字列を返します.
GetRedirectUrl
ログインページにリダイレクトする元の要求URLを返します.GetRedirectUrlメソッドは、クエリ文字列でReturn URL変数名で指定されたURLを返します.例えば、URLhttp://www.contoso.com/login.aspx?ReturnUrl=caller.aspxで、GetRedirectUrlメソッドはcallerに戻る.aspx.ReturnURL変数が存在しない場合、GetRedirectUrlメソッドはDefaultUrlプロパティのURLを返します.
RedirectFromLoginPage
認証されたユーザーを、最初に要求されたURLまたはDefaultUrlにリダイレクトします.
RedirectToLoginPage
ブラウザをログインURLにリダイレクトします.
RenewTicketIfOld
FormsAuthenticationTicketの発行日と時間、および有効期限と時間を条件付きで更新します.このメソッドは、更新されたFormsAuthenticationTicketオブジェクトを返すだけで、Cookiesには書き込まれません.
GetAuthCookie
特定のユーザ名に対して認証Cookieを作成し、応答するCookieセットまたはURLには追加しません.
SetAuthCookie
指定したユーザー名の認証チケットを作成し、応答するCookieセットまたはURLに追加します.
SignOut
ブラウザからForms認証チケットを削除します.
6.チケットカスタムデータの適用
カスタムチケットを使用する場合は、userDataパラメータを追加できます.このパラメータをうまく利用することは、ユーザVIPレベル番号の格納、所有する権限/ロールセットなど、予想外のメリットをもたらすことができます.もちろんCookieとURLパラメータの長さは限られており、このカスタムデータはあまり長くはできません.