クライアントのページをホストするマルチテナントWebサイトを作成しています。URLの最初のセグメントは、次のURLルーティングスキーマを使用してGlobal.asaxで定義された、クライアントを識別する文字列になります。
"{client}/{controller}/{action}/{id}"
これは、/ foo / Home / IndexなどのURLで正常に機能します。
しかし、[Authorize]属性を使用すると、同じマッピングスキームを使用するログインページにリダイレクトしたいと思います。したがって、クライアントがfooの場合、ログインページは、web.configで定義された固定の/ Account / Loginリダイレクトではなく、/ foo / Account / Loginになります。
MVCはHttpUnauthorizedResultを使用して401無許可ステータスを返します。これにより、ASP.NETがweb.configで定義されたページにリダイレクトされると思います。
では、ASP.NETログインリダイレクトの動作をオーバーライドする方法を知っている人はいますか?または、カスタム認証属性を作成してMVCでリダイレクトする方が良いでしょうか?
編集-回答: .Netソースを少し調べた後、カスタム認証属性が最良のソリューションであると判断しました。
public class ClientAuthorizeAttribute: AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext filterContext )
{
base.OnAuthorization( filterContext );
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}