やりたいこと
https://garafu.blogspot.jp/2016/05/manage-aspnet-authorization.html
上記のURLの<属性で制御する方法>では、web.configに設定した
<authentication mode="Forms">
<forms loginUrl="/Account/Login" />
</authentication>
この部分で静的にログインページのURLが決定してしまう。
これを動的に切り替えたい。
やり方
- System.Web.Mvc.AuthorizeAttributeクラスのHandleUnauthorizedRequestメソッドをoverrideする
- HandleUnautholizedRequestメソッドの引数AuthorizationContextのインスタンスのResultプロパティにRedirectToResultクラスのインスタンスを格納する。
- 動的に設定したいコントローラ(controller)とアクション(action)はRouteValueDictionaryクラスのインスタンスを作成する際に指定する
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
string controllerName; // 動的に変更したいログインページのコントローラ
string actionName; // 動的に変更したいログインページのアクション
if (isSmapho(filterContext.HttpContext.Request.UserAgent))
{
filterContext.Result = new RedirectToRouteResult
(
new System.Web.Routing.RouteValueDictionary(
new
{
controller = controllerName,
action = actionName,
returnUrl = HttpContext.Current.Request.Url
}
)
);
}
}
}
上の例ではスマホからのアクセスかどうかでログイン先を動的に変更するようにしている。(スマホからのアクセスかどうかはisSmaphoメソッドで判定)
HandleUnauthorizedRequestメソッド:(https://msdn.microsoft.com/ja-jp/library/ee427992(v=vs.118).aspx)
AuthorizationContextクラス:(https://msdn.microsoft.com/ja-jp/library/system.web.mvc.authorizationcontext(v=vs.118).aspx)
RedirectToResultクラス:(https://msdn.microsoft.com/ja-jp/library/system.web.mvc.redirecttorouteresult(v=vs.118).aspx)
RouteValueDictionaryクラス:https://msdn.microsoft.com/ja-jp/library/system.web.routing.routevaluedictionary(v=vs.110).aspx