3

これは少し無知な質問かもしれませんが、私は mvc を初めて使用するので、申し訳ありません!

私はオタクディナー認証モデルを研究しましたが、私のアプリでは複雑な役割ベースの認証を行っています。だから私がすることはこれです:

 void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
        {
            HttpCookie authCookie = HttpContext.Current.Request
               .Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                string encTicket = authCookie.Value;
                if (!String.IsNullOrEmpty(encTicket))
                {
                    FormsAuthenticationTicket ticket = 
                            FormsAuthentication.Decrypt(encTicket);
                    CustomIdentity id = new CustomIdentity(ticket.Name);
                    GenericPrincipal prin = new GenericPrincipal(id, id.Roles);
                    HttpContext.Current.User = prin;
                }
            }
        }

ログオン時に FormsAuth でユーザー名/パスを認証してから、Cookie を作成します。

ここでの問題は、カスタム ID を作成するたびに、ユーザーの役割についてデータベースにクエリを実行する必要があることです。これを回避する正しい方法はありますか、それともすべての着信要求で DB を照会するために正しいことをしていますか? 役割リストを Cookie などに保存する必要がありますか?

また、フォーム認証が認証を処理する方法のライフサイクル全体をよく理解していませんか? IFormsAuthentication私はオタクディナーユーザーと同じデザインパターンを使用し、サインイン中に呼び出しFormsAuth.SignIn()ます, メソッドFormsAuthentication.SetAuthCookieを呼び出すのはいつmembershipservice.validateuser()ですか?? また、認証 Cookie が設定されている場合、なぜ nerd dinner はチケットを作成し、それをリクエストに追加し、それを読み取ってPostAuthenticationRequestどのユーザーであったかを確認します。チケット操作はセッションのようなものですか?

ありがとう!メリークリスマス!


更新:このリンクにより、フォーム認証チケットについて少し理解が深まりました。

4

2 に答える 2

3

"正しい?" それは意見の問題です。

このクエリが原因でデータベースのパフォーマンスに問題が発生していない場合は、心配する必要はありません。

そうであれば、認証コードをある種の認証プロバイダーまたはタイプに集中化し、書き込みによってデータベースが更新されるまで認証情報をメモリにキャッシュし、同時にキャッシュを無効にすることができます。

(あなたの 2 番目の質問はそれ自体でうまくいきます。答えるのに十分な情報がありません。)

于 2010-12-25T19:40:34.357 に答える
2

別の方法として、ユーザーが認証されたときにユーザーのロールを認証チケットに保存する方法があります。次に、すべての要求 ( Application_AuthenticateRequestglobal.asax ファイルのメソッド) に対して、認証チケットからロールを抽出し、GenericPrincipal.

詳細については、この回答を参照してください。

于 2010-12-26T12:08:50.903 に答える