0

.netメンバーシップでMVC3を使用しています。役割に応じて、ユーザーを別のビューにリダイレクトしたいと思います。

AccountControlerコントローラーのLogOnメソッドでUser.IsInRole(xxx)を使用しようとしましたが、機能しません。私がここで見たものから: Forms Authentication User.IsInRole()がLogOnでランダムに機能しない

そのメソッドでメンバーシップUserを呼び出すことはできません(ログインしていないため、ユーザーにログインするためのCookieがまだ設定されていません)

関連性があるとは思いませんが、念のため、これはMVC3プロジェクトにデフォルトで付属しているLogOnメソッドであり、私が変更しようとしたものです。

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

私の質問は次のとおりです。ログイン時にロール(私には2、3のロールしかありません)に従ってユーザーをリダイレクトするエレガントな方法は何ですか?「会員データベースに問い合わせるだけ」という推奨事項を見ましたが、それが適切な方法ではないと思います。

何かアドバイス?

ありがとう!..

PnP

4

1 に答える 1

0

あなたが私の質問にリンクしたので、これが私が見つけたものです。はUser.IsInRole()、応答からユーザー名を取得します。log onアクションには(Model.UserNameで検索せずに)ユーザー名がないため、ロール内のユーザーは見つかりません。それらをリダイレクトすると、ユーザー情報がリダイレクトに追加され、ユーザーを役割で並べ替えることができます。(少なくとも、それが私が見つけたものだと思います。)これがあなたがしたいことです:

アカウントコントローラーで次を置き換えます。

if (Membership.ValidateUser(model.UserName, model.Password))
{
    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
}

と:

if (Membership.ValidateUser(model.UserName, model.Password))
{
    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Redirect", "Account");
    }
}

そして追加:

public ActionResult Redirect()
{ 
    if(User.IsInRole("Role1"))
        return RedirectToAction("Index", "Home")
    else if(User.IsInRole("Role2"))
        return RedirectToAction("SomethingElse", "Home")
    else
        return RedirectToAction("AnotherThing", "Home")
}
于 2012-08-30T23:06:20.817 に答える