2

SimpleMembershipがUserIdをどこかに保持するのか、そうでない場合は、派生データを保持するように強制するのか疑問に思います。

私には簡単な行動があります:

    [Authorize(Roles="User")]
    public ActionResult Create()
    {
        var ownerId = WebSecurity.GetUserId(User.Identity.Name);
        return View()
    }

そして私のMiniProfilerは言います:

 DECLARE @0 nvarchar(4) = N'NICK'
 SELECT [UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = @0)   

 DECLARE @0 int = 2
 SELECT r.RoleName FROM webpages_UsersInRoles u, webpages_Roles r Where 
 (u.UserId = @0 and u.RoleId = r.RoleId) GROUP BY RoleName 

 DECLARE @0 nvarchar(4) = N'NICK'
 SELECT [UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = @0)  

したがって、UserIdのクエリを複製しました。最初にロールを取得し、次に。を呼び出しWebSecurity.GetUserId(User.Identity.Name);ます。[承認]を呼び出した後、UserIdをどこかに保存するスマートな方法はありますか?

4

1 に答える 1

4

私は通常、ユーザープロファイルをセッション変数でラップします。

 public static userProfile UserInfo
 {
     get { return HttpContext.Current.Session["UserInfo"] as userProfile; }
     set { HttpContext.Current.Session["UserInfo"] = value; }
 }

ユーザーがログインしてUserProfileテーブルにクエリを実行した後、

UserInfo = QueryAsClass; //you need to map your sql to an object

そこに着いたら、いつでもアクセスできます

UserInfo.userId

userProfileアプリケーションにオブジェクトクラスとしてテーブルがあります

編集

ユーザーがログインした後に実行されるこのコードがあります

using (var db = new DBEntities())
    {
        var userId = WebSecurity.GetUserId(HttpContext.Current.User.Identity.Name);
        if (userId == -1) return;
        SessionHelpers.UserInfo = db.userProfiles.Single(x => x.userId == userId);
    }

私はEF5を使用しておりuserProfile、モデルにテーブルがあるため、EFを使用していない場合は、この部分を調整する必要があります。

私が必要なとき、userId私はただしますSessionHelpers.UserInfo.userId。これにより、データベースを再クエリせずに、必要なときにいつでもすべてのユーザープロファイル情報を取得できます。

もちろん、ユーザーのプロファイルで何かを変更した場合は、セッション変数も更新する必要があります。

より高度なロジックを使用して、セッションがnullでないことを確認する必要がある場合があります(これは他の場所で行っています)。

于 2012-12-06T19:52:47.697 に答える