まず最初に、AuthorizeCore
メソッド内でリダイレクトしないでください。HandleUnauthorizedRequest
この目的のために意図された方法を使用する必要があります。LogOnアクションにエラーメッセージを渡すことに関する限り、TempDataを使用できます。
public class SecurityAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// perform the custom authorization logic here and return true or false
// DO NOT redirect here
return httpContext.Session["UserID"] != null;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Controller.TempData["ErrorMessage"] = "You are not authroize to perform this action.Please Login through different account";
// calling the base method will actually throw a 401 error that the
// forms authentication module will intercept and automatically redirect
// you to the LogOn page that was defined in web.config
base.HandleUnauthorizedRequest(filterContext);
}
}
次に、ログオンアクション内で:
public ActionResult LogOn()
{
string errorMessage = TempData["ErrorMessage"] as string;
...
}
または、ビュー内でアクセスする場合LogOn.cshtml
:
<div>@TempData["ErrorMessage"]</div>
もう1つの可能性は、TempDataを使用する代わりに、メッセージをクエリ文字列パラメーターとして渡すことです。
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var values = new RouteValueDictionary(new
{
controller = "User",
action = "LogOn",
errormessage = "You are not authroize to perform this action.Please Login through different account"
});
filterContext.Result = new RedirectToRouteResult(values);
}
次に、LogOn
アクションにエラーメッセージをアクションパラメータとして受け取らせることができます。
public ActionResult LogOn(string errorMessage)
{
...
}