2016-05-09 4 views
1

ログインページ以外のすべてのページでユーザーの認証が必要となるように、Webサイト全体を保護したいと考えています。これを達成するために、私は、アプリケーションの起動時にAuthorizeフィルタを登録します。 Umbraco MVC - どのように私はglobaをオーバライドすることができますコントローラのフィルタを承認?

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new AuthorizeAttribute()); 
} 

は今まだそれに [AllowAnonymous]属性を適用したにもかかわらず認証されるユーザーが必要です私の LoginController、との問題があります。ページには、他の子アクションはありません

[AllowAnonymous] 
public class LoginController : SurfaceController 
{ 
    public LoginController() 
    { 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken]   
    [AllowAnonymous] 
    public async Task<ActionResult> HandleLogin(LoginModel model, string returnTo) 
    { 
     return CurrentUmbracoPage(); 
    } 
} 

と問題がLoginControllerで決定的である:これは私のログインコントローラです。ここで何が起こり、どのように修正することができますか?

UPDATE:私の見解ではあり

ログインページテンプレート:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage 
@{ 
    // Layout = "Master.cshtml"; 
    Layout = null; 
} 
    <div>@Umbraco.Field("bodyText")</div> 
    @Html.Partial("Login") 

ログイン部分がある:

@using ClientDependency.Core.Mvc 
@using PlayProj.Presentation.Controllers 
@using Umbraco.Web 
@using Umbraco.Web.Models 

@{ 
    var loginModel = new LoginModel(); 

    Html.EnableClientValidation(); 
    Html.EnableUnobtrusiveJavaScript(); 

    Html 
     .RequiresJs("~/scripts/jquery.validate.hooks.js", 200) 
     .RequiresJs("~/scripts/foundation.form.validation.js", 201); 
} 

@using (Html.BeginUmbracoForm<LoginController>("HandleLogin", null, new { @class = "loginForm", autocomplete = "off" })) 
{ 
    <fieldset> 
     <legend>Login</legend> 

     <button>Login</button> 
    </fieldset> 
} 
+0

これまでのところ、正しいパスを辿っていますが、「LoginController」に関する十分な情報が表示されていません。たぶん、あなたが手伝ってくれるものがなかったかもしれません。そのクラスの残りの部分を表示してください。 – Nkosi

+0

こんにちはNikosi、コントローラは本当に他に何も持っていません - HandleLoginアクションだけ。しかし、この問題はすでにページ・ロード時に発生しています。ページは無限リダイレクションループに入ります。 – lekso

+0

標準Umbracoの「パブリックアクセス」機能を使用しているだけではない理由はありますか?メンバーを認可している場合、世界中のすべてのサーフェスコントローラでこれを設定しようとするよりも簡単になります。また、ページ全体や一部の部分だけを保護しようとしていますか?編集:RenderMvcControllerはおそらくより良い選択になります。 –

答えて

0

よりもむしろグローバルフィルタを登録し、あなたは多分、デフォルトのコントローラを交換できAuthorize属性が設定されている場合デフォルトでは、ハイジャックされたルートを持たないすべてのページは、あなたの新しい認可されたデフォルトコントローラーを経由してルーティングされます。あなたはそのようなApplicationStartingイベント中にUmbracoのデフォルトのコントローラを変更することができます。

DefaultRenderMvcControllerResolver.Current.SetDefaultControllerType(typeof(YourDefaultController)); 
0

代わりのグローバルAuthorizeAttributeを使用して独自のベースコントローラを実装し、そこに承認を扱うことができます。

public class AuthorizedSurfaceController : SurfaceController 
{ 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var authorized = false; //get this from your provider 
     if(!authorized) 
     { 
      filterContext.Result = new RedirectResult("/login"); 
     } 
    } 
} 
関連する問題