クライアントのページをホストするマルチテナンシー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 }
});
}
}
}