none
Loginコントロールでユーザー名の大文字小文字が区別されない RRS feed

  • 質問

  • ASP2.0のLoginコントロールについての質問です。

    Loginコントロールを使ってログインページを作成したのですが、
    ユーザー名の入力で大文字小文字が区別されません。

    ASP.NET webサイト管理ツールで例えば「test」というユーザーを作成したときに、
    Loginコントロールでユーザー名に「TEST」と入力してログインできてしまいます。
    SqlMembershipProviderを使っております。

    web.configファイルの<membership>の<providers>の<add>要素に
    ユーザー名の大文字小文字を区別するオプションは無いようです。

    ユーザー名の大文字小文字を区別したいのですが、どのようにすれば宜しいでしょうか。
    ご教授をお願いします。

     

    2006年9月21日 2:46

回答

  • データベースのデフォルトの照合順序が大文字小文字を区別しない Japanese_CI_AS で作成されているためだと思われます。
    データベースを大文字小文字の区別ある Japanese_Unicode_BIN で作成するか、aspnet_Users テーブルの UserName を Japanese_Unicode_BIN に変更してください。

    aspnet_regsql.exe からパーソナライズで必要なスクリプトを生成し

    aspnet_regsql.exe -A all -sqlexportonly C:\aspnetdb.sql

    そのスクリプトの 28 行目付近にある

    SET @dboptions = N'/**/'



    SET @dboptions = N' COLLATE Japanese_Unicode_BIN '

    として作成してみてください。

    2006年9月21日 3:31
  • なるほど。
    であれば、

    aspnet_Users_CreateUser
    aspnet_Membership_CreateUser
    aspnet_Membership_GetUserByName
    aspnet_Membership_GetPasswordWithFormat
    aspnet_Membership_UpdateUserInfo
    aspnet_Membership_GetPassword
    aspnet_Membership_SetPassword
    aspnet_Membership_ResetPassword
    aspnet_Membership_UnlockUser
    aspnet_Membership_UpdateUser
    aspnet_Membership_ChangePasswordQuestionAndAnswer
    aspnet_Membership_FindUsersByName
    aspnet_Profile_GetProperties
    aspnet_Profile_SetProperties
    aspnet_Profile_GetProfiles
    aspnet_UsersInRoles_IsUserInRole
    aspnet_UsersInRoles_GetRolesForUser
    aspnet_UsersInRoles_AddUsersToRoles
    aspnet_PersonalizationPerUser_GetPageSettings
    aspnet_PersonalizationPerUser_ResetPageSettings
    aspnet_PersonalizationPerUser_SetPageSettings
    aspnet_PersonalizationAdministration_ResetUserState
    aspnet_PersonalizationAdministration_FindState
    aspnet_PersonalizationAdministration_GetCountOfState

    のストアドプロシージャで行われている LOWER(@UserName) の記述を @UserName に変えるだけで OK です。
    #漏れがあるかもしれないので、スクリプト生成して置換してください。

    2006年9月21日 4:27

すべての返信

  • データベースのデフォルトの照合順序が大文字小文字を区別しない Japanese_CI_AS で作成されているためだと思われます。
    データベースを大文字小文字の区別ある Japanese_Unicode_BIN で作成するか、aspnet_Users テーブルの UserName を Japanese_Unicode_BIN に変更してください。

    aspnet_regsql.exe からパーソナライズで必要なスクリプトを生成し

    aspnet_regsql.exe -A all -sqlexportonly C:\aspnetdb.sql

    そのスクリプトの 28 行目付近にある

    SET @dboptions = N'/**/'



    SET @dboptions = N' COLLATE Japanese_Unicode_BIN '

    として作成してみてください。

    2006年9月21日 3:31
  • おがわみつぎ様の回答を拝見しまして、先の質問に照合順序について記載することを忘れていました。
    お手数掛けまして申し訳ありませんでした>おがわみつぎ様

    データベースの照合順序ですが、「Japanese_CS_AS_KS_WS」で設定しております。

    その後、試行錯誤しながら調べてみましたところ
    Loginコントロールで認証する際、SqlMembershipProviderは入力されたログイン名を
    aspnet_UsersテーブルのLoweredUserNameカラムの値と比較しているようなのです(UserNameカラムではなく)。

    またSqlMembershipProviderクラスを介してユーザー登録をすると、LoweredUserNameカラムにはユーザー名を小文字にして登録されるので
    SqlMembershipProviderを使用している限りはログイン名の大文字小文字は区別されないようです。
    これは恐らく仕様なのではないかと思います。

    2006年9月21日 4:05
  • なるほど。
    であれば、

    aspnet_Users_CreateUser
    aspnet_Membership_CreateUser
    aspnet_Membership_GetUserByName
    aspnet_Membership_GetPasswordWithFormat
    aspnet_Membership_UpdateUserInfo
    aspnet_Membership_GetPassword
    aspnet_Membership_SetPassword
    aspnet_Membership_ResetPassword
    aspnet_Membership_UnlockUser
    aspnet_Membership_UpdateUser
    aspnet_Membership_ChangePasswordQuestionAndAnswer
    aspnet_Membership_FindUsersByName
    aspnet_Profile_GetProperties
    aspnet_Profile_SetProperties
    aspnet_Profile_GetProfiles
    aspnet_UsersInRoles_IsUserInRole
    aspnet_UsersInRoles_GetRolesForUser
    aspnet_UsersInRoles_AddUsersToRoles
    aspnet_PersonalizationPerUser_GetPageSettings
    aspnet_PersonalizationPerUser_ResetPageSettings
    aspnet_PersonalizationPerUser_SetPageSettings
    aspnet_PersonalizationAdministration_ResetUserState
    aspnet_PersonalizationAdministration_FindState
    aspnet_PersonalizationAdministration_GetCountOfState

    のストアドプロシージャで行われている LOWER(@UserName) の記述を @UserName に変えるだけで OK です。
    #漏れがあるかもしれないので、スクリプト生成して置換してください。

    2006年9月21日 4:27
  • aspnet_regsql.exeでaspnetdbと共に作成されるストアドプロシージャを先に調べれば解決が早かったですね。
    存在に気づきませんでしたorz
    ですが、SqlMembershipProviderについて理解が深まりました。

    今回はSqlMembershipProviderの仕様でログイン名の大文字小文字の区別はしないということで了承頂きました。

    今後そのような要件があった場合はストアドプロシージャをカスタマイズすることにします。
    ありがとうございました。

    2006年9月21日 5:04