1

MVC4 アプリで SimpleMembership を使用しており、ユーザーが自分のユーザー名を変更できるようにする必要があります。

機能が機能しているので、ユーザーがユーザー名を変更すると機能します。ただし、 Roles.IsUserInrole() などを呼び出すと、 User.Identity.Name が新しい値ではなく、ログインしたものに設定されるため失敗します。名前が変更されたため、その値はデータベースに存在しなくなりました。

ログインしているユーザー コンテキストをユーザー名で更新する方法がわかりません。ほとんどの場合、ユーザー ID をセッションに保存し、クエリを実行するときにそれを取得できますが、失敗したビューにデータを表示するために Roles メソッドを使用しています。

何か案は?

ありがとう!

4

2 に答える 2

5

これは私の現在の(実用的な)ソリューションです:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(AccountEditModel model)
    {
        if (ModelState.IsValid)
        {
            if (HasSensitiveInformationChanged(model)) // model.EmailAddress.ToLower() != User.Identity.Name.ToLower()
            {
                if (Membership.ValidateUser(User.Identity.Name, model.Password)) // && WebSecurity.IsCurrentUser(User.Identity.Name)) //redundant?
                {
                    using (UsersContext db = new UsersContext())
                    {
                        UserProfile user = db.UserProfiles.FirstOrDefault(u => u.EmailAddress.ToLower() == User.Identity.Name.ToLower());

                        if (user != null)
                        {
                            user.EmailAddress = model.EmailAddress;
                            db.SaveChanges();
                            WebSecurity.Logout();
                            WebSecurity.Login(model.EmailAddress, model.Password);
                            return RedirectToAction("Index", "Search");
                        }
                        else
                        {
                            ModelState.AddModelError("", "Could not find user. Please try logging in again.");
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("","Could not change email address. Please verify your password and try again.");
                }
            }
            else
            {
                //no change
                return RedirectToAction("Index", "Search");
            }
        }

        return View("Index", model);
    }
于 2013-03-14T00:26:02.353 に答える
0

ユーザー名フィールドを変更できるとは思いませんでした (どのように変更したかを教えていただければ幸いです)。

私が見る唯一の解決策は、ユーザー名を変更した後にユーザーを強制的にログオフさせることです。そのため、ユーザーが再度ログインすると、正しい User.Identity.Name になります。

于 2013-03-11T14:59:21.920 に答える