ASP.NET MVCでのダイナミックログインURLにリダイレクトする方法
-
21-08-2019 - |
質問
私はクライアントのためのページをホストするマルチテナントのウェブサイトを作成しています。 URLの最初のセグメントは、次のURLルーティングスキームを使用してのGlobal.asaxに定義されたクライアントを識別する文字列を、次のようになります。
"{client}/{controller}/{action}/{id}"
このような/ fooの/ホーム/インデックスとしてURLを、正常に動作します。
ただし、[承認]属性を使用しているとき、私はまた同じマッピング方式を使用して、ログインページにリダイレクトします。クライアントがfooであれば、ログインページではなく、web.configファイルで定義された固定/アカウント/ログインリダイレクトの/ fooの/アカウント/ログインになります。
MVC私はweb.configファイルで定義されたページにリダイレクトさせるのASP.NETを推定401の不正なステータスを返すようにHttpUnauthorizedResultを使用します。
だから、誰もが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 }
});
}
}
}
解決
私は、主な問題は、あなたは組み込みのASP.NETをFormsAuthenticationクラスに便乗するつもりなら、一日の終わりに何かが呼び出すために起こっている(そして、あなたがないはずない良い理由はありません)ということだと思います1つの構成されたURLを見に行くされてFormsAuthentication.RedirectToLoginPage()
。そこだけ1つのログインURLはこれまで、だし、それは彼らがそれを設計し、どれだけです。
問題(おそらくルーブ・ゴールドバーグ・インプリメンテーション)での私の刺しはそれがすべてのクライアントが共有するルートに単一のログインページにリダイレクトできるようになり、/アカウント/ログイン言います。このログインページには、実際には何も表示されませんでした。それはにreturnurlパラメータまたは私はセッションまたはクライアントを識別し、即時302は、特定のクライアント/ /アカウント/ログインページにリダイレクトを発行することを使用してクッキーに持っているいくつかの値のいずれかを検査します。それは余分なリダイレクトですが、そう気にならないし、それはあなたがリダイレクトメカニズムに組み込まれて使用することができます。
他のオプションは、あなた自身のリダイレクトロジックに置き換えることがありますので、あなたは、RedirectToLoginPage()
クラスにFormsAuthentication
メソッドを呼び出して何かを説明し、避けるよう、独自のカスタム属性を作成することです。それは静的なクラスですので、(あなたが似ている独自のクラスを作成します。)、私は、どのあなたは自分自身の代替インタフェースを注入でき、それは魔法のように、既存の[オーソライズ]属性で動作していることにより、任意のメカニズムを認識していませんよ打撃、しかし人はの前に同様のことを行っている。
希望!
他のヒント
ASP.NET MVCのRTM版では、Cancelプロパティがありません。このコードは、ASP.NET MVC RTMで動作します:
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;
namespace ePegasus.Web.ActionFilters
{
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary
{
{ "langCode", filterContext.RouteData.Values[ "langCode" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}
}
<時間>
の編集のあなたは、web.configファイルで、デフォルトのフォーム認証loginUrlを無効にすることもできます - 場合に誰かは、カスタム属性を持っていると誤って[承認]属性に建て使用し忘れました。 P>
web.configファイル内の値を変更します:
<forms loginUrl="~/Account/ERROR" timeout="2880" />
次に、エラーを記録し、あなたが持っている最も一般的なログインページにユーザーをリダイレクトするアクションメソッド「エラー」を行います。
この問題に対する私のソリューションは、カスタムActionResult
クラスだっます:
sealed public class RequiresLoginResult : ActionResult
{
override public void ExecuteResult (ControllerContext context)
{
var response = context.HttpContext.Response;
var url = FormsAuthentication.LoginUrl;
if (!string.IsNullOrWhiteSpace (url))
url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);
response.Clear ();
response.StatusCode = 302;
response.RedirectLocation = url;
}
public RequiresLoginResult (string returnUrl = null)
{
ReturnUrl = returnUrl;
}
string ReturnUrl { get; set; }
}
それでも、組み込みのASP.NETをFormsAuthentication、1はApplication_AuthenticateRequest
でGlobal.asax.cs
をオーバライドすることができます:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
string url = Request.RawUrl;
if (url.Contains(("Account/Login"))
{
return;
}
if (Context.User == null)
{
// Your custom tenant-aware logic
if (url.StartsWith("/foo"))
{
// Your custom login page.
Response.Redirect("/foo/Account/Login");
Response.End();
return;
}
}
}