1

MVC 3 を使用します。アカウント情報は独自のデータストアに保存され、アクセスは独自のリポジトリ クラスを介して行われるため、デフォルトのユーザー管理は使用できません。

プリンシパル追加ロールを HttpContext.User に割り当て、認証 Cookie を発行しようとしています。

切り取ったコードに基づいて、次のようなことを試したことがわかりました。

if (UserIsOk(name, password))
{
    HttpContext.User =
        new GenericPrincipal(
            new GenericIdentity(name, "Forms"),
            new string[] { "Admin" }
        );
    FormsAuthentication.SetAuthCookie(name, false);

    return Redirect(returnUrl);
}

次のリクエストが行われると、ユーザーは認証されますが、「管理者」ロールではありません。私は何が欠けていますか?

4

2 に答える 2

0

FormsAuthenticationTicketを実装する必要があると思います。詳細はこちら: http://msdn.microsoft.com/en-us/library/aa289844(v=vs.71).aspx

Mvc では、非常に似ています。

LoginController に挿入され、LogOn アクションで使用する UserSession というクラスがあります。

    [HttpPost, ValidateAntiForgeryToken]
public ActionResult Index(LoginInput loginInput, string returnUrl)
{
    if (ModelState.IsValid)
    {
        return (ActionResult)_userSession.LogIn(userToLog, loginInput.RememberMe, CheckForLocalUrl(returnUrl), "~/Home");
    }
}

これが私の UserSession LogIn 実装です (この例では「管理者」ロールをハードコードしましたが、引数として渡すことができます):

public object LogIn(User user, bool isPersistent, string returnUrl, string redirectDefault)
    {
        var authTicket = new FormsAuthenticationTicket(1, user.Username, DateTime.Now, DateTime.Now.AddYears(1), isPersistent, "Admin", FormsAuthentication.FormsCookiePath);
        string hash = FormsAuthentication.Encrypt(authTicket);

        var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);

        if (authTicket.IsPersistent) authCookie.Expires = authTicket.Expiration;

        HttpContext.Current.Response.Cookies.Add(authCookie);

        if (!String.IsNullOrEmpty(returnUrl))
            return new RedirectResult(HttpContext.Current.Server.UrlDecode(returnUrl));

        return new RedirectResult(redirectDefault);
    }

次に、ベース コントローラーで OnAuthorization メソッドをオーバーライドして Cookie を取得しました。

if (filterContext.HttpContext.Current.User != null)
{
   if (filterContext.HttpContext.Current.User.Identity.IsAuthenticated)
   {
      if( filterContext.HttpContext.Current.User.Identity is FormsIdentity ) 
      {
         FormsIdentity id = filterContext.HttpContext.Current.User.Identity as FormsIdentity;
         FormsAuthenticationTicket ticket = id.Ticket;
         string roles = ticket.UserData;

         filterContext.HttpContext.Current.User = new GenericPrincipal(id, roles);
      }
   }
}

これが役立つことを願っています。お知らせ下さい。

于 2011-12-06T17:13:01.803 に答える
0

確かに、ロールが有効になっていて、そのようなロールはありますか?

そうでない場合は、次の手順を実行します。Visual Studio の場合: [プロジェクト] -> [ASP.NET 構成]

次に、[セキュリティ] を選択し、ロールを有効にします。ロール「管理者」を作成します。

次に、アプローチを試してください

于 2011-12-07T10:24:41.957 に答える