MVC 4でフォーム認証を使用してユーザーを認証しようとしています(RavenDBを使用しているため、標準のメンバーシッププロバイダーを使用できません)。その後、このUser.IsInRole()
方法を使用AuthorizeAttribute
するか、ユーザーがスタッフの役割を果たしていることを確認します。
ここで、認証が成功したときにチケットを設定します(現時点ではUserController.cs
):
FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(
1,
model.Email,
DateTime.Now,
DateTime.Now.AddDays(1),
false,
model.Email);
string hashedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie =
new HttpCookie(
FormsAuthentication.FormsCookieName,
hashedTicket);
HttpContext.Response.Cookies.Add(cookie);
ここで、各リクエストのチケットを確認します(Global.asax
):
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
var user = this.UserService.GetUserByEmail(authTicket.Name);
var identity = new GenericIdentity(authTicket.Name, "Forms");
var principal = new GenericPrincipal(identity, user.Roles);
HttpContext.Current.User = principal;
}
}
次に、アクションメソッドの1つ(CalendarController.cs)にデバッグポイントを設定すると、次のようにisStaff
なりfalse
ます。
public ActionResult Index()
{
var user = HttpContext.User;
bool isStaff = user.IsInRole(Role.Staff);
return View();
}
完了のためだけに(Roles.cs、物事をテストするための一時的なクラス):
public static class Role
{
public static string Staff
{
get { return "Staff"; }
}
public static string Manager
{
get { return "Manager"; }
}
}
誰かが私が欠けているかもしれないものについて私にポイントを与えるのを手伝ってもらえますか?アクションメソッドにたどり着くまでに、設定した役割がなくなっているように見えます。