2012-03-12 8 views
6

私はFormsAuthenticationを使用しますが、カスタムユーザーテーブルに対して検証するカスタムMemberShipProviderを追加しました。ユーザーID(MVC)を維持するためのベストプラクティス

「ユーザーデータ」を含むすべての表にはidUser列があるため、ユーザーにデータを提示するためにユーザーIDを維持する必要があります。

以前はセッション変数(ASP.NET Webform)を使用していましたが、WebアプリケーションをMVCに書き直しているので、一般的にこれについての最良のアプローチと考えられています。

セッション変数はまだidUserを保持するのに最適な場所ですか、またはユーザー名に加えてパブリックuserIdも保持するカスタム "Current.User.Identity"を追加する必要がありますか?

完全に異なるアプローチを選択する必要がありますか?

答えて

3

MVCのカスタムメンバーシッププロバイダを実装したときと同じ質問がありました。私は2つのことをやってしまった。ユーザーのIDをMembershipUserオブジェクトのProviderUserKeyフィールドに保存します。 provideruserkeyを参照してください。あなたの質問に答えるために、はい、System.Web.Security.IPrincipalからカスタムプリンシパルを作成しましたが、後でSystem.Web.Security.RolePrincipalから継承しましたが、私はロールのサポートが必要だったためです。

public class MyPrincipal : RolePrincipal 
{ 
    public Guid Id { get; set; } 

    public MyPrincipal(string providerName, IIdentity identity, Guid id) : base(identity) 
    { 
     Id = id; 
    } 
} 

アップデート:私はアプリのためにそれを無効にしたので、私は私の場合には、セッションを使用したくなかった理由があります。私は、MVCの背後にあるコアコンセプトは懸念の分離であり、それはステートレスであるWebの仕組みを厳密にモデル化しているということを読んだ。私が今どこでそれを読んで覚えているのか覚えていないのですが。しかし、私はあなたがそうする必要がありますセッションを削除することができます読んで覚えています。これは、次の要求がセッションを使用してその応答を送信する前に、1つの要求が完了するのを待つ必要がなく(そしてユーザーのセッションを解放する)必要なく、アプリケーションからの同時要求をIISが処理できるようにします。その最大の影響はAjaxを使用してページ・コンテンツをロードすることです。

+0

ありがとう!私も同様のアプローチを考えていました。上記の@Mark.Sと同意しますが、最も簡単なのはセッションオブジェクトを使用することです。 – Kman

+0

セッションを避けた理由の詳細を追加しました –

+0

セッションは必ずしも悪くはなく、必然かもしれません。多くの場合、ユーザーはセッションを無効にして、Cookieに頼りすぎてすべてのHTTPリクエストのサイズを増やし始めません。同時リクエストを処理するもう1つの方法は、MVC4ベータ版ではかなり簡単な非同期コントローラを使用することです。これは以前のバージョンの小さな作業で行うことができます。 – Mark

3

あなたのユーザー名は一意ですか?そうであれば、ユーザー名でユーザーを取得するだけでUserIdを維持する必要はありません。

MVCプロジェクトでは、従来のWebフォームアプリケーションとほぼ同じメンバーシップが実装されています。あなたがステートレスなREST型アプリケーションを構築しようとしているのでなければ、2つの違いを見る理由はないと思います。どのようにWebフォームでUserIdを維持しましたか?セッション?その後、MVCでセッションを使用します。車輪を再発明する理由はありません。

もちろん、変更する他の理由がある場合は、UserIdを保存する方法がたくさんあります。それを認証クッキーのUserDataに格納することができます。ユーザー名ではなくキーとしてUserIdを使用する独自の認証チケットを作成することもできます。追加の情報を保存するカスタムプリンシパルを作成することもできます。

Forms Authentication Configuration and Advanced Topicsを確認してください。この記事では、認証チケットに追加データ(UserId)を格納し、カスタムプリンシパルを作成する方法について説明します。どちらの方法もあなたの要件に合っています。

+0

ユーザー名は一意ですが、userId原因はモデル(データベース)のID列です。だから私はそれをクエリする必要がテーブルからデータを取得...どこuserid = idUser。あなたが提供したリンクを見ていきます:) – Kman

+0

セッションは、あなたのUserIdを維持するための最も簡単で迅速な方法です。 MVCの使用は確かにセッションの使用を排除するものではありません。私の2セント、セッションを使用します。 – Mark

+0

私は同意します。 Webformアプリケーションでうまくやっています。私の主な関心事は、MVCではアプローチが「時代遅れ」だったということでした。再度、感謝します!:) – Kman

関連する問題