2009年11月12日木曜日

ASP.NET カスタムロールプロバイダを利用したアクセス制御

前回ASP.NETカスタムメンバーシッププロバイダを利用したログイン
Memberフォルダ配下のページはログインしていないユーザのアクセスを拒否するよう設定しました。
今回は新たにAdminフォルダを作成し、Adminフォルダ配下のページはAdminロールを持っているユーザのみアクセスを許可するように設定します。

前回のコードに追加していきます。

カスタム ロール プロバイダーの作成

まずカスタムロールプロバイダを作成します。
App_Codeに「CustomRoleProvider.vb」クラスを追加します。
CustomRoleProviderクラスはRoleProviderクラスを継承します。
抽象メソッドをオーバーラドしたメソッドが追加されますのでGetRolesForUserメソッドにロールを取得するコードを書きます。
その他のメソッドはNotSupportedExceptionをスローするようにしておきます。

Public Class CustomRoleProvider
    Inherits RoleProvider

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

    Public Overrides Function GetRolesForUser(ByVal username As String) As String()
        '入力されたusernameを元に、ユーザのロールを取得します。
        return new String(){"Admin"}
    End Function

    Public Overrides Sub AddUsersToRoles(ByVal usernames() As String, ByVal roleNames() As String)
        Throw New NotSupportedException
    End Sub

    Public Overrides Sub CreateRole(ByVal roleName As String)
        Throw New NotSupportedException
    End Sub

    Public Overrides Function DeleteRole(ByVal roleName As String, ByVal throwOnPopulatedRole As Boolean) As Boolean
        Throw New NotSupportedException
    End Function

    Public Overrides Function FindUsersInRole(ByVal roleName As String, ByVal usernameToMatch As String) As String()
        Throw New NotSupportedException
    End Function

    Public Overrides Function GetAllRoles() As String()
        Throw New NotSupportedException
    End Function

    Public Overrides Function GetUsersInRole(ByVal roleName As String) As String()
        Throw New NotSupportedException
    End Function

    Public Overrides Function IsUserInRole(ByVal username As String, ByVal roleName As String) As Boolean
        Throw New NotSupportedException
    End Function

    Public Overrides Sub RemoveUsersFromRoles(ByVal usernames() As String, ByVal roleNames() As String)
        Throw New NotSupportedException
    End Sub

    Public Overrides Function RoleExists(ByVal roleName As String) As Boolean
        Throw New NotSupportedException
    End Function
End Class


web.configを編集

作成したカスタムロールプロバイダを登録します。
<!--ロールプロバイダ-->
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
 <providers>
  <add name="CustomRoleProvider" type="CustomRoleProvider"/>
 </providers>
</roleManager>

Adminフォルダ配下のページは非認証ユーザを拒否し、Adminロールのみ許可を与えます。
<!--adminフォルダ-->
<location path="admin">
 <system.web>
  <authorization>
   <deny users="?" />
   <allow roles="Admin" />
  </authorization>
 </system.web>
</location>

<?xml version="1.0"?>
 ・・・省略
 <system.web>
  ・・・省略
  <!--認証方法 Form認証-->
  <!--<authentication mode="Windows"/>-->
  <authentication mode="Forms">
   <forms loginUrl="Default.aspx"/>
  </authentication>
  <!--メンバシッププロバイダ-->
  <membership defaultProvider="CustomMembershipProvider">
   <providers>
    <add name="CustomMembershipProvider" type="CustomMembershipProvider"/>
   </providers>
  </membership>
  <!--ロールプロバイダ-->
  <roleManager enabled="true" defaultProvider="CustomRoleProvider">
   <providers>
    <add name="CustomRoleProvider" type="CustomRoleProvider"/>
   </providers>
  </roleManager>
     <!--すべてのユーザーにアクセス許可を与える-->
    <authorization>
   <allow users="*"/>
  </authorization>
 </system.web>
 <!--**個別フォルダ・ページのセキュリティ**-->
 <!--Memberフォルダ-->
 <location path="Member">
  <system.web>
   <authorization>
    <deny users="?" />
   </authorization>
  </system.web>
 </location>
 <!--adminフォルダ-->
 <location path="Admin">
  <system.web>
   <authorization>
    <deny users="?" />
    <allow roles="Admin" />
   </authorization>
  </system.web>
 </location>
</configuration>

1 件のコメント:

拓人 さんのコメント...

お世話になっております。
GetRolesForUserはどこから呼ばれるのでしょうか?
もしくは、戻り値を何にセットするとconfigの設定が有効になるのでしょうか?
よろしくお願いします。