2009年11月6日金曜日

ASP.NET カスタムメンバーシッププロバイダを利用したログイン

カスタム メンバーシップ プロバイダーの作成

まずカスタムメンバーシッププロバイダを作成します。
App_Codeに「CustomMembershipProvider.vb」クラスを追加します。
CustomMembershipProviderクラスはMembershipProviderクラスを継承します。
抽象メソッドをオーバライドしたメソッドが追加されますのでValidateUserメソッドに認証のコードを書きます。
その他のメソッドはNotSupportedExceptionをスローするようにしておきます。
Public Class CustomMembershipProvider
    Inherits MembershipProvider

    '-----Overridesプロパティ-----

    Public Overrides Property ApplicationName() As String
        Get
            Throw New NotImplementedException
        End Get
        Set(ByVal value As String)
            Throw New NotImplementedException
        End Set
    End Property

    Public Overrides ReadOnly Property EnablePasswordReset() As Boolean
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property EnablePasswordRetrieval() As Boolean
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property RequiresQuestionAndAnswer() As Boolean
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property RequiresUniqueEmail() As Boolean
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property MinRequiredNonAlphanumericCharacters() As Integer
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property MinRequiredPasswordLength() As Integer
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property PasswordAttemptWindow() As Integer
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property PasswordFormat() As System.Web.Security.MembershipPasswordFormat
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property PasswordStrengthRegularExpression() As String
        Get
            Throw New NotImplementedException
        End Get
    End Property

    Public Overrides ReadOnly Property MaxInvalidPasswordAttempts() As Integer
        Get
            Throw New NotImplementedException
        End Get
    End Property

    '-----Overrides メソッド-----
    ''' <summary>
    ''' ここでログイン認証のチェックを行う
    ''' </summary>
    ''' <param name="username"></param>
    ''' <param name="password"></param>
    Public Overrides Function ValidateUser(ByVal username As String, ByVal password As String) As Boolean
        'とりあえずTrueを返す。
        Return True
    End Function

    Public Overrides Function ResetPassword(ByVal username As String, ByVal answer As String) As String
        Throw New NotImplementedException
    End Function

    Public Overrides Function ChangePassword(ByVal username As String, ByVal oldPassword As String, ByVal newPassword As String) As Boolean
        Throw New NotImplementedException
    End Function

    Public Overrides Function ChangePasswordQuestionAndAnswer(ByVal username As String, ByVal password As String, ByVal newPasswordQuestion As String, ByVal newPasswordAnswer As String) As Boolean
        Throw New NotImplementedException
    End Function

    Public Overrides Function CreateUser(ByVal username As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String, ByVal passwordAnswer As String, ByVal isApproved As Boolean, ByVal providerUserKey As Object, ByRef status As System.Web.Security.MembershipCreateStatus) As System.Web.Security.MembershipUser
        Throw New NotImplementedException
    End Function

    Public Overrides Function DeleteUser(ByVal username As String, ByVal deleteAllRelatedData As Boolean) As Boolean
        Throw New NotImplementedException
    End Function

    Public Overrides Function FindUsersByEmail(ByVal emailToMatch As String, ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Security.MembershipUserCollection
        Throw New NotImplementedException
    End Function

    Public Overrides Function FindUsersByName(ByVal usernameToMatch As String, ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Security.MembershipUserCollection
        Throw New NotImplementedException
    End Function

    Public Overrides Function GetAllUsers(ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Security.MembershipUserCollection
        Throw New NotImplementedException
    End Function

    Public Overrides Function GetNumberOfUsersOnline() As Integer
        Throw New NotImplementedException
    End Function

    Public Overrides Function GetPassword(ByVal username As String, ByVal answer As String) As String
        Throw New NotImplementedException
    End Function

    Public Overloads Overrides Function GetUser(ByVal providerUserKey As Object, ByVal userIsOnline As Boolean) As System.Web.Security.MembershipUser
        Throw New NotImplementedException
    End Function

    Public Overloads Overrides Function GetUser(ByVal username As String, ByVal userIsOnline As Boolean) As System.Web.Security.MembershipUser
        Throw New NotImplementedException
    End Function

    Public Overrides Function GetUserNameByEmail(ByVal email As String) As String
        Throw New NotImplementedException
    End Function

    Public Overrides Function UnlockUser(ByVal userName As String) As Boolean
        Throw New NotImplementedException
    End Function

    Public Overrides Sub UpdateUser(ByVal user As System.Web.Security.MembershipUser)
        Throw New NotImplementedException
    End Sub

    
End Class

認証後に表示するページの作成

Memberフォルダを追加し、Top.aspxファイルを追加します。

ログインコントロールの配置

Default.aspxにログインコントロールを配置します。
ログインコントロールのDestinationPageUrlプロパティに「~/Member/Top.aspx」を指定します。
これで正しくログインできたときにMember/Top.aspxが表示されます。

web.configを編集

認証方法をフォーム認証に設定し、loginUrl要素にログインコントロールを配置したDefault.aspxを指定します。
<!--<authentication mode="Windows"/>-->
<authentication mode="Forms">
    <forms loginUrl="Default.aspx"/>
</authentication>

作成したカスタムメンバーシッププロバイダを登録します。
<!--メンバシッププロバイダ-->
<membership defaultProvider="CustomMembershipProvider">
 <providers>
  <add name="CustomMembershipProvider" type="CustomMembershipProvider"/>
 </providers>
</membership>

すべてのユーザにアクセス許可を与えるように設定します。
<!--すべてのユーザーにアクセス許可を与える-->
<authorization>
 <allow users="*"/>
</authorization>

Memberフォルダ配下のページは認証していないユーザのアクセスは拒否します。
<!--Memberフォルダ 非認証ユーザを拒否する-->
<location path="Member">
 <system.web>
  <authorization>
            <deny users="?"/>
     </authorization>
 </system.web>
</location>
authorization要素の
allow要素は「許可を与える」
deny要素は「拒否する」
users="*"は「すべてのユーザ」
users="?"は「認証していないユーザ」
となります。
<allow users="*"/>で、すべてのユーザにページアクセスの許可を与え
<deny users="?"/>で、非認証ユーザを拒否します。
user1に許可を与え、非認証ユーザを拒否するようにするには以下のように記述します。
<authorization>
    <allow user="user1"/>
    <deny user="?"/>
</authorization>

<?xml version="1.0"?>
    …省略
    <system.web>
        …省略
  <!-- 
            <authentication> セクションは、ユーザーを識別するため
            に、ASP.NET で使用されるセキュリティ認証モードの構成
            を有効にします。-->
  <!--認証方法 Form認証-->
  <!--<authentication mode="Windows"/>-->
  <authentication mode="Forms">
   <forms loginUrl="Default.aspx"/>
  </authentication>
  <!--メンバシッププロバイダ-->
  <membership defaultProvider="CustomMembershipProvider">
   <providers>
    <add name="CustomMembershipProvider" type="CustomMembershipProvider"/>
   </providers>
  </membership>
  <!--すべてのユーザーにアクセス許可を与える-->
  <authorization>
   <allow users="*"/>
  </authorization>
 </system.web>
 <!--**個別フォルダ・ページのセキュリティ**-->
 <!--Memberフォルダ 非認証ユーザを拒否する-->
 <location path="Member">
  <system.web>
   <authorization>
        <deny users="?"/>
   </authorization>
  </system.web>
 </location>
</configuration>

以上で設定は終了です。
IEでMember/Top.aspxにアクセスするとログインページにリダイレクトされます。
ログインページでユーザー名、パスワードを入力するとMember/Top.aspxに遷移します。

1 件のコメント:

mika さんのコメント...

kuriboさんこんばんは☆

Bloggerに広告(Adsense以外)を貼り付けたいのですが、どうしたらいいんでしょうか?

テンプレートからHTMLの編集でしょうか?
↑の場合、どこにコピー・貼り付けをするのが適切でしょうか?

初コメントで、突然の質問で申し訳ないのですが、いろいろ調べてもわからなくて。。。

ご教授よろしくお願いしますm(__)m