すべてのリクエストでロールベースのカスタム認証データベースを持つ正しい方法ASP.NET MVC
質問
これはわずかに無知な質問かもしれませんが、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;
}
}
}
ログオンIでは、FormSauthを使用してユーザー名/パスを認証し、Cookieを作成します。
ここでの問題はです カスタムアイデンティティを作成するたびに、 ユーザーの役割のデータベースをクエリします. 。ありますか 正しい これを回避する方法、または私はすべての着信リクエストでDBを照会するために正しいことをしていますか?役割リストをCookieなどに保存する必要がありますか?
また、Forms Authが認証をどのように処理するかというライフサイクル全体を本当に理解していませんか?同じことを使用しています IFormsAuthentication
オタクディナーユーザーとサインイン中に私が電話するデザインパターン FormsAuth.SignIn()
順番に呼び出します FormsAuthentication.SetAuthCookie
, 、いつ呼び出すことができますか membershipservice.validateuser()
方法 ??また、 Auth Cookieが設定されています なぜオタクディナーはチケットを作成し、リクエストに追加してから読んでから読むのですか PostAuthenticationRequest
それがどのユーザーであったかを確認します。チケット操作はセッションのように操作しますか?
ありがとう!メリークリスマス!
アップデート : このリンク フォーム認証チケットについて少しよく理解してくれました。
解決
別のアプローチは、ユーザーが認証されたときにユーザーの役割を認証チケットに保存することです。次に、すべてのリクエストに対して(Application_AuthenticateRequest
Global.asaxファイルの方法)認証チケットから役割を抽出し、 GenericPrincipal
.
この答えを参照してください 詳細については。
他のヒント
"正しい?"その意見の問題。
このクエリによって引き起こされたデータベースのパフォーマンスに関する問題が発生していない場合は、心配しないでください。
そうであれば、認証コードを何らかの認証プロバイダーまたはタイプに集中させ、書き込みがデータベースを更新するまで認証情報をメモリ内にキャッシュすることができます。これにより、キャッシュが同時に無効になります。
(あなたの2番目の質問はそれ自体でうまくいくでしょう。私はそれに答えるのに十分な情報を持っていません。)