0

私の下手な英語でごめんなさい。

事実:

  • ASP.NET MVC3
  • EF5.
  • フォーム認証
  • roleManager 無効

私の実装はこのコンセプトに従います! +以下のコードを参照

すべてがうまく機能します

  • ローカル サーバー IIS Win7 (WebDeploy)
  • & 私の古い Windows Server 2008

アプリを

  • 新しい Windows Server 2008 Web

役割に問題がある

  • isInRole()
  • [Authorize(Roles = "member,admin")]属性

正常に動作していません。

ここにいくつかのコード スニペットとデバッグ出力があります

ヘルパー クラス

public static class UserHelper
{
        public static bool IsAdmin(this ViewUserControl pg)
        {
            // @TODO Delete (Glimpse output)

            string s = HttpContext.Current.User.IsInRole("admin") ? "UserHelper.IsAdmin()  IsInRole() == true" : "UserHelper.IsAdmin() Application_AuthenticateRequest  IsInRole() == false";
            string b = pg.Page.User.IsInRole("admin") ? "UserHelper.IsAdmin()  IsInRole() == true" : "UserHelper.IsAdmin() Application_AuthenticateRequest  IsInRole() == false";

            Trace.Write(s);
            Trace.Write(b);           

            var id = HttpContext.Current.User.Identity as FormsIdentity;
            Trace.Write("UserHelper.isAdmin(): UserData"+id.Ticket.UserData);

            // ============================

            return HttpContext.Current.User.IsInRole("admin");
        }
}

Global.asax.cs

public class MvcApplication : HttpApplication
{
    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        if (HttpContext.Current.User == null) return;
        if (!HttpContext.Current.User.Identity.IsAuthenticated) return;
        if (!(HttpContext.Current.User.Identity is FormsIdentity)) return;

        var id = HttpContext.Current.User.Identity as FormsIdentity;
        var userState = new UserState();
        userState.FromString(id.Ticket.UserData);
        HttpContext.Current.User = new GenericPrincipal(id, userState.Rollen.Split(new[] { ',' }));

        // @TODO Delete (Glimpse output)
        Trace.Write("Global.asax.cs -> Application_AuthenticateRequest Userdata: "+id.Ticket.UserData);
        string s = HttpContext.Current.User.IsInRole("admin") ? "Global.asax.cs -> Application_AuthenticateRequest IsInRole() == true" : "Global.asax.cs -> Application_AuthenticateRequest IsInRole() == false";
        Trace.Write(s);
    }

AccountController.cs (例)

   [Authorize(Roles = "member,admin")]
   [UserActive]
   public ActionResult ChangePassword()
   {
     return View();
   }

FormAuthService.cs

public class FormAuthService : IFormsAuthentication
{
    public void Login(string userName, bool createPersistentCookie, IEnumerable<string> roles, int? userID = null)
    {
        var str = string.Join(",", roles);

        var userData = new UserState
        {
            Benutzername = userName,
            ID = userID.HasValue ? userID.Value : 0,
            Rollen = str,
            IsAdmin = str.Split(',').Contains("admin")
        };

        var authTicket = new FormsAuthenticationTicket(
            1,
            userName,
            DateTime.Now,
            DateTime.Now.AddDays(30),
            createPersistentCookie,
            userData.ToString(),
            "/"
        );

        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));

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

        HttpContext.Current.Response.Cookies.Add(cookie);
    }
}

Glimpse でコードをデバッグしていました。私が達成しようとしているのは、最初のスクリーンショットです...

私のUserHelper クラスと属性[Authorize]を持つ他のすべてのクラスでは、このセットアップでローカル に動作します。

しかし、アプリケーションをリモート IIS にデプロイすると、管理者としてログインしていることを認識しません (ログインしていますが、役割が機能していません)。2 番目のスクリーンショットでは、"admin" を含む UserData が表示されていますが、IsInRole メソッドは失敗しています。

スクリーンショット:

ローカルホスト http://s13.postimg.org/o9uqhlv6v/wi_local_glimpse_works.png

リモートサーバー http://s9.postimg.org/pcavzvczj/wi_local_glimpse_works23.png

私は何が欠けていますか?誰も同じ問題を経験しましたか?

4

1 に答える 1