2009-07-19 8 views
0

asp.net global.asaxでは、httpcontext.userの役割を割り当てるコードはどこに書くべきですか?Asp.net Formauthenticationの "Hhtpcontext.user"の役割

私がサイトで読んだのは、global.asaxの "Application_onPostauthentication"イベントの一部でなければならないが、そこに書き込むと、ユーザーの各要求に対して実行されるということではない。私はこれがセッションで1つの認証のために1つを取り出すべきだと思います。

なぜマイクロソフトでもコードを書くことを提案しているのですか?もし誰かが私の事実を知っていれば教えてください。

答えて

1

.NET 2.0では、設定ロールを処理するthe built-in role management featureを使用できます。

.NET 1.1の場合、または組み込みの役割管理を使用できない、または使用したくない理由がある場合は、PostAuthenticateRequestイベントを使用するとよいでしょう。

セッションは、(a)セッションの有効期間がフォームauthenticatio cookieの有効期間とは完全に独立しており、(b)セッションが有効にされていない可能性があるため、ロールの保存には使用されません。

各リクエストでロールを設定する必要がありますが、これは問題ではありません。そのたびにデータベース(*)からそれらを取得する必要はありません。それらをどこかにキャッシュすることができます。セッションでそれらをキャッシュするのは合理的な解決策ですが、そこに見つからない場合はデータベースから再度読み込むコードを組み込む必要があります。

(*)またはそれらを保存した場所。セッションでの役割をキャッシュするたとえば

EDIT

、あなたのような何かを行うことができます:別の方法としては、ASP.NETキャッシュ内の役割を格納することで、セッションへの依存を避けることができ

string[] GetRoles(string userName) 
{ 
    string[] roles = Session["Roles"] as string[]; 
    if (roles == null) 
    { 
     roles = GetRolesFromDatabase(userName); 
     Session["Roles"] = roles; 
    } 
    return roles; 
} 

をおそらく、有効期限が切れている。キャッシュはすべてのリクエスト間で共有されるため、キャッシュキーの一部としてユーザー名を使用する必要があります。

string[] GetRoles(string userName) 
{ 
    string cacheKey = "Roles:" + userName; 

    string[] roles = Cache[cacheKey] as string[]; 
    if (roles == null) 
    { 
     roles = GetRolesFromDatabase(userName); 
     Cache.Insert(cacheKey, roles, ...); 
    } 
    return roles; 
} 
+0

すてきなソリューションをありがとうございます。あなたの返事の最後の段落。 "セッション中の役割を捕まえることは合理的な解決策です" 例のリンクがあれば、もっと理解できるようにしてください –

+0

@HemantKothiyal:地獄、なぜあなたはこの答えをアップアップして受け入れなかったのですか?非常に便利で、Joeはあなたのコメントの後にさらに情報を提供しました。なぜあなたが彼の努力に感謝していないのか分かりません。 – Slauma

関連する問題