0

わかりました、排水管を下った午後、私はSOの支援を認めます。私のログイン方法はかなり標準的です。以下に示すように、私は WebSecurity.Login を使用しています。

その直後に、ユーザーのプロファイルが完成しているかどうかを確認し、完成していない場合はそのビューに送信します。

コントローラ

[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid && WebSecurity.Login(model.Email, model.Password, persistCookie: model.RememberMe))
    {

        if (!User.IsInRole("User"))
        {
            if (!IsProfileComplete(WebSecurity.GetUserId(User.Identity.Name)))
            {
                return RedirectToAction("ProfileCompletion");
            }

            if(!User.IsInRole("User")) Roles.AddUserToRole(User.Identity.Name, "Vendor");
        }
        else // user has role
        {
            return RedirectToAction("Index", "Dashboard");
        }
    }

    ModelState.AddModelError("", "Unknown username or password.");
    return View(model);
}

私はそれをたくさん踏み出しました....WebSecurity.Loginの後、WebSecurityユーザーデータが設定されるという印象を受けましたが、WebSecurity.GetUserId(User.Identity.Name)は-1として返されます

ユーザーがプロファイルを完了した場合でも、ユーザー ID -1 のプロファイルを検索しようとしているため、プロファイルの完了にリダイレクトされます。

http 投稿とログイン コンテキスト セットについて、何か不足しているものはありますか? 私が探している最終結果は、ユーザーがシステムに入る前にプロファイル ページを完了していることを確認することです。多分これを行うためのより良い方法がありますか?

編集 - - -

このリンクを見つけましたが、誰かが私の目的の機能のより良いパターンを提案できれば、簡単なコメントをいただければ幸いです

MVC 4 SimpleMembership - ログイン後に WebSecurity.CurrentUserId -1 になる理由

4

1 に答える 1

1

あなたが見つけた投稿が指摘したように、ユーザーIDはログイン直後に設定されないため、 User.Identity.Name にはユーザー名が含まれていません。代わりに model.UserName を使用してください。この行を変更してみてください:

if (!IsProfileComplete(WebSecurity.GetUserId(User.Identity.Name)))

これに:

if (!IsProfileComplete(WebSecurity.GetUserId(model.UserName)))
于 2013-09-03T19:56:54.463 に答える