2009-04-22 16 views
4

基本的には、OpenIdを使用して私のウェブサイトにログインします。私はSOがそうであると仮定しています。私は情報を取り戻すと、データベースに投げ込んで「登録ユーザー」を作成します。私は私のAuthCookieを設定しました:Stack Overflowのようなサイトは、ASP.NET MVCでユーザ情報を渡すのはどうでしょうか?

FormsAuthentication.SetAuthCookie(user.Profile.MyProfile.DisplayName, false); 

私はこれをユーザー名に使うことができます。しかし、表示名の文字列の代わりにオブジェクト全体を渡したいと思います。だから私の質問は:

どうすればいいのですか?

SetAuthCookie(string, bool)メソッドを拡張して、ユーザーオブジェクトを受け入れる方法(つまりSetAuthCookie(User(object), bool))を上書きしますか?

私のWebアプリケーションのすべての単一ページでUserControlが利用できるように、Userオブジェクトを永続化する最善の方法は何ですか?

ありがとうございます!

+0

あなたがOpenIDを使ってログインするために使用していますか?過去に私はいくつかの成功のためにhttp://code.google.com/p/dotnetopenid/を使用しました。ここで何をしたいのかを示すサンプルを提供しています。 – Noldorin

+0

私は自分のASP.NET MVCの例を使ってログインしています。ちょうどコアで、case文のメソッドでピックアップします(ここで私は上の行を見つけています。)元々、このコードはこのように見えました... FormsAuthentication.SetAuthCookie私はあなたのスコアを知っているところでここでやっているようにいくつかの基本的な情報をプッシュできるようにしたい、あなたのuserId(ハイパーリンクにありますなど –

+1

Jeff!あなたのユーザー名にはDISPLAYNAMEを使用しないでください!これは巨大なセキュリティホールです。SetAuthCookieの最初のパラメータにClaimedIdentifierを使用する必要があります。 –

答えて

3

implementingあなたのカスタムMembership Providerによってこの動作を達成するか、既存のものを拡張することができます。プロバイダはキーに基づいて(またはユーザ名だけで)ユーザ情報を保存し、MembershipUserクラスへのアクセスを提供します。したがって、FormsAuthentication.SetAuthCookie(...)と呼ぶときは、基本的にユーザ鍵を設定します。ユーザ鍵はプロバイダにアクセスできます。

Membership.GetUser()を呼び出すと、メンバーシップインフラストラクチャは基になるプロバイダーを呼び出し、GetUser(...)メソッドを呼び出して、現在のユーザーのキーを提供します。したがって、現在のユーザーオブジェクトが表示されます。

1

1つの方法は、現在ログインしているユーザーの情報を取得する責任を負うクラスをコントローラに挿入することです。ここで私がそれをした方法があります。 IUserSessionというインターフェースを実装するWebUserSessionというクラスを作成しました。次に、コントローラーインスタンスの作成時に依存関係注入を使用してコントローラーに注入するだけです。私は私のインターフェイス上に、GetCurrentUserというメソッドを実装しました。これは、必要に応じてビューに渡すことで自分のアクションで使用できるUserオブジェクトを返します。

using System.Security.Principal; 
using System.Web; 

public interface IUserSession 
{ 
    User GetCurrentUser(); 
} 

public class WebUserSession : IUserSession 
{ 
    public User GetCurrentUser() 
    { 
     IIdentity identity = HttpContext.Current.User.Identity; 
     if (!identity.IsAuthenticated) 
     { 
      return null; 
     } 

     User currentUser = // logic to grab user by identity.Name; 
     return currentUser; 
    } 
} 

public class SomeController : Controller 
{ 
    private readonly IUserSession _userSession; 

    public SomeController(IUserSession userSession) 
    { 
     _userSession = userSession; 
    } 

    public ActionResult Index() 
    { 
     User user = _userSession.GetCurrentUser(); 
     return View(user); 
    } 
} 

ご覧のとおり、必要に応じてユーザーを取得できるようになりました。もちろん、GetCurrentUserメソッドを変更して、最初にセッションを調べたり、必要に応じて他の手段を使用したりすることができます。したがって、常にデータベースにアクセスする必要はありません。

2

ジェフ、

私は上記のあなたの質問にコメントで言ったように、あなたユーザー名のClaimedIdentifierを使用する必要があります - 、SetAuthCookieの最初のパラメータです。これには大きなセキュリティ上の理由があります。理由をもっと理解したい場合は、[email protected]でスレッドを開始してください。

ユーザーオブジェクト全体についてのあなたの質問について...クッキーとして送信したい場合は、ユーザーオブジェクトを文字列としてシリアル化しなければならないでしょうユーザーの改ざんを防ぐ方法それを暗号化することもできます。それは大変な作業です。あなたが望んでいないすべてのWebリクエストで、大きなクッキーを行き来することになります。

私が問題を解決するために私のアプリケーションで行うことは、CurrentUserという名前のGlobal.asax.csファイルに静的プロパティを追加することです。このように:

public static User CurrentUser { 
    get { 
     User user = HttpContext.Current.Items["CurrentUser"] as User; 
     if (user == null && HttpContext.Current.User.Identity.IsAuthenticated) { 
      user = Database.LookupUserByClaimedIdentifier(HttpContext.Current.User.Identity.Name); 
      HttpContext.Current.Items["CurrentUser"] = user; 
     } 
     return user; 
    } 
} 

お知らせ私は、単一のHTTPリクエストに固有のものですHttpContext.Current.Items辞書、で結果をキャッシュし、ユーザーはシングルヒットまでフェッチし続ける - そしてそれだけフェッチページが実際にCurrentUser情報を必要とする場合は初めてです。

ので、ページが簡単にこのようなユーザ情報で現在のログに記録されたを取得することができます:

User user = Global.CurrentUser; 
if (user != null) { // unnecessary check if this is a page that users must be authenticated to access 
    int age = user.Age; // whatever you need here 
} 
+0

これを調べます。私は昨日自分のMembershipProviderを作るのに8時間を費やしました。数時間後に私は更新します。この方法は、私が昨日やったやり方よりずっと簡単です。私はまた私がここに見るものが好きです。 –

+0

これは私が一緒に行くつもりだと思います。それは私が持っているものにすぐに差し込み、言及したような1つのコールしか必要としません。私は、あなたが記述したメソッドを使ってカスタムプロバイダなしでこれを行うことができます。ありがとう。 –

+0

それはあなたのためにうれしいです。私はasp.netメンバーシッププロバイダが、OpenIDなどのリダイレクトベースのパスワードレス認証プロトコルにはあま​​り適していないことがわかりました。 OpenIDで動作するメンバーシッププロバイダーは、インターフェイスがうまく適合しないため、途中で奇妙にしか実装できません。 –

関連する問題