0

MVC3 サイトに非常に基本的なログイン スキームを実装しようとしています。私の理解が正しければ、 [Authorize] マークアップを各コントローラー クラスに追加する代わりに、単純にグローバル設定を実装できるはずです。これを実現するために、global.asax に以下を追加しました。

protected void Application_Start()
{
    RegisterGlobalFilters(GlobalFilters.Filters);
}

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

}

そして私のwebconfigに、次を追加しました:

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

その結果、結果のページは完全に空白になります。URLを見ると、ページが空であることを除いて、mvcが期待どおりにログインルートにリダイレクトしているようです。global.asax のコードをコメント アウトし、[Authorize] マークアップを各コントローラーに直接配置すると、期待どおりに動作します。

回避策として、私が読んだ MVC2 のベスト プラクティスを実装しました。つまり、BaseController:Controller クラスを作成し、それに [Authorize] マークアップを追加してから、すべてのコントローラーの固有性を継承するように変更します。コントローラーの代わりにベースコントローラー。

それは今のところ十分に機能しているようです。

しかし、global.asax の実装が機能しないのはなぜでしょうか?

4

1 に答える 1

3

ここで何が起こっているか見てみましょう:

  1. に移動しています/
  2. グローバル認証属性が有効になり、ユーザーが認証されていないため、認証のためにリダイレクトさ~/Account/LogOnれます (web.config ファイルで指示されているとおり)。
  3. グローバル認証属性が有効になり、ユーザーが認証されていないため、認証のためにリダイレクトさ~/Account/LogOnれます (web.config ファイルで指示されているとおり)。
  4. 3と同じ。
  5. 4と同じ。
  6. ...

私はあなたがポイントを得ると思います。アクションは認証から除外する必要があります。LogOnそうしないと、ユーザーが Web サイトにログインする機会が得られません。

Authorize 属性をグローバルに適用したため、これを行うことはできません。考えられる 1 つの方法は、グローバルに適用され、このアクションを認証から除外するカスタム AuthorizeAttribute を作成することです。

したがって、マーカー属性を書くことができます:

public class AllowAnonymousAttribute : Attribute
{
}

およびグローバル カスタム承認属性:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var exclude = ((AllowAnonymousAttribute[])filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), false)).Any();
        if (!exclude)
        {
            base.OnAuthorization(filterContext);
        }
    }
}

それが登録されます:

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

あとは、認証から除外したいコントローラー アクションを、マーカー属性で装飾するだけです。

public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult LogOn()
    {
        return View();
    }

    [AllowAnonymous]
    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        ...
    }
}
于 2012-07-18T14:50:06.170 に答える