2

カスタム メンバーシップとロール プロバイダー用に独自のクラスを開発しました。

すべてがローカルで機能します。それにもかかわらず、テストのためにソリューションを IIS に展開した後、私のログイン アクションは機能しているように見えます (少なくとも、アクションはユーザー名とパスワードを検証し、ユーザーは認証されているように見えます)。

  [Authorize(Roles="Employee, Admin")]

ユーザーが必要な役割を持っていないかのように、ログインページにリダイレクトされ続けます (ただし、彼は持っています)。

ローカルでは、アプリケーションはアクションを実行する前にユーザーの検証と認証されたユーザーのロールのチェックに成功します (したがって、両方のクラスのメソッドは正しいと思います) が、IIS ではロール プロバイダーが正しく動作していないようです。どこが間違っているのか、または問題をよりよく理解するにはどうすればよいかを知っている人はいますか?

私のWeb.Configで:

<system.web>
(...)
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<membership defaultProvider="CustomMembershipProvider">
  <providers>
    <clear />
    <add name="CustomMembershipProvider" type="MyApplication.Infrastructure.CustomMembershipProvider" connectionStringName="DBEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
  <providers>
    <clear />
    <add name="CustomRoleProvider" type="MyApplication.Infrastructure.CustomRoleProvider" connectionStringName="DBEntities" applicationName="/" />
  </providers>
</roleManager>
(...)
</system.web>

前もって感謝します。

編集:追加情報。

  • アクションの注釈の 1 つを単純に [Authorize] に変更したところ、機能しました。したがって、認証は機能し、問題はロール プロバイダーに関連しているに違いないと思います。

  • 私は自分のデータ モデルに Entity Framework を使用しています。文字列は次のとおりです。

  • ユーザーを登録し、新しく作成したアカウントを使用してログインできました。これは、DB 接続とカスタム メンバーシップ プロバイダー (?) が正常に機能していることを意味します。

  • "@foreach (Roles.GetRolesForUser(User.Identity.Name) 内の文字列 str){@str} はロールをローカルに出力し、デプロイ時には何も出力しません。

4

2 に答える 2

1

わかりました、私はそれを修正しました。誰かが将来それを必要とする場合の説明は次のとおりです。

原因を絞り込んだ後 (私の編集で見られるように)、問題は CustomRoleProvider に関連しているに違いないことがわかりました。

そのクラスには、次のようなメソッドがあります。

  public override string[] GetRolesForUser(string Username)
  {
        List<string> roles = new List<string>();

        using (DBEntities _db = new DBEntities())
        {
            try
            {
                var dbRoles = from r in _db.UserRole
                              where r.Users.Username == Username
                              select r;

                foreach (var role in dbRoles)
                {
                    roles.Add(role.Role.Name);
                }
            }
            catch 
            {
            }
        }

        return roles.ToArray();
  }

そのため、例外をキャッチしていましたが、それに対して何もしていませんでした。try-catch ブロックを削除したところ、次のメッセージが表示されました。

  There is already an open DataReader associated with this Command which must be closed first.

少しのスタックオーバーフローで、これを見つけました:このコマンドに関連付けられた開いている DataReader が既にあり、最初に閉じる必要があります

私のローカル接続文字列にはありましMultipleActiveResultSets=trueたが、公開設定の接続文字列にはありませんでした。パブリッシュ設定を変更したところ、現在は機能しているようです。

その設定の利点/欠点はよくわかりませんが、機能しているので、次に進む必要があります。とにかく助けてくれてありがとう。

于 2013-08-05T15:57:19.313 に答える
0

同様の問題がありました。machineKey を web.config に追加すると、すべてが正常に機能します。

<system.web>
<machineKey validationKey="2E417D4AC04F20FA6CE1CF1EFE23FBF1695BF6981B605B1B8628D2182C43D0B10E48C4A83FDCE0D1D6300095D9EE1B8746A37E2C3256554405983DCAA7622875" decryptionKey="FA6D35C22BF7E5E9E4438052B924CCC017521137C5EB017D07C7038B80C5F726" validation="SHA1" decryption="AES" />
  </system.web>
于 2013-08-05T15:09:53.467 に答える