私の下手な英語でごめんなさい。
事実:
- 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
私は何が欠けていますか?誰も同じ問題を経験しましたか?