1

私は管理サイトと公開サイトを持つMVC3サイトを持っています。これらのコントローラ、ビュー、モデルなどは、同じ単一のMVCプロジェクトに含まれています。したがって、管理サイトはAdminというMVC3エリアにあり、公開サイトは領域に属していませんが、トップレベルに存在します。管理サイトにはログインビューがあり、パブリックサイトにはログインビューもあります。私のweb.configファイルで私が持っている:複数のフォームのログインページ

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogIn" timeout="2880" /> 
</authentication> 

を今、私は偉大な公共サイトのログインページに取られます認証が必要な公共サイトの任意のページにアクセスした場合。しかし、管理領域内で認証が必要なページにアクセスすると、再びパブリックサイトのログインページが表示されます。それで問題は、私が管理者ログインページに送られる認証を必要とする管理エリアのページにいる場合、どうすればよいかどうかを確認することです。

答えて

6

ローカライズされたログインページが必要な場合、同様の問題が発生しました。

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 
        { 
          { "language", filterContext.RouteData.Values[ "language" ] }, 
          { "controller", "Account" }, 
          { "action", "LogOn" }, 
          { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
        }); 
     } 
    } 
} 

はちょうどこの属性の代わりに、デフォルトの承認の属性を使用します。 は、私は、カスタム属性を認可を作成します。 あなたのケースでは、リクエストURLとそのリダイレクトに応じて、適切なログインページを確認できます。

2

カスタムAuthorize属性を書き込んで、HandleUnauthorizedRequestメソッドをオーバーライドして、要求が管理者に行われたかどうかをテストし、それに応じてリダイレクトすることができます。

public class MyAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     var area = filterContext.RequestContext.RouteData.Values["area"] as string; 
     if (string.Equals("admin", area, StringComparison.OrdinalIgnoreCase)) 
     { 
      // if the request was for a resource inside the admin area 
      // redirect to a different login page than the one in web.config 
      // in this particular case we redirect to the index action 
      // of the login controller in the admin area. Adapt this 
      // accordingly to your needs. You could also externalize this 
      // url in the web.config and fetch it from there if you want 

      var requestUrl = filterContext.HttpContext.Request.Url; 
      var urlHelper = new UrlHelper(filterContext.RequestContext); 
      var url = urlHelper.Action(
       "index", 
       "login", 
       new 
       { 
        area = "admin", 
        returnUrl = requestUrl.ToString() 
       } 
      ); 
      filterContext.Result = new RedirectResult(url); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

そして今、このカスタムのauthorize属性の代わりに、デフォルトのいずれかを使用しますの線に沿って

何か。

0

必ずfilterContext.RouteData.DataTokens ["area"]を使用してください。 の代わりにfilterContext.RouteData.Values ["area"];このような

public class AreaAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string LoginController = "Account"; 
    public string LoginAction = "Login"; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      var area = filterContext.RouteData.DataTokens["area"]; 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary 
       { 
        { "area", area}, 
        { "controller", LoginController }, 
        { "action", LoginAction }, 
        { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
       }); 
     } 
    } 

使用:

[AreaAuthorizeAttribute(= "AreaLoginController" LoginController、ロール= "管理者")]