web-dev-qa-db-ja.com

[Authorize]属性をすべてのWeb APIコントローラーに暗黙的に適用する

私のアプリケーションは、ログインを除くすべてのリクエストがWeb APIの承認属性を使用して「承認」される必要があるセットアップです。例えば。

 [Authorize]
 [HttpGet, Route("api/account/profile")]
 public ApplicationUser Profile()
 {
       return userModel;
 }

トークンを取得する場所であるため、ログインのみを認証する必要はありません;)

[AllowAnonymous]
[HttpPost, Route("api/account/login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
   ....
}

[Authorize]属性をすべてのルートに追加する代わりに、グローバルに設定する方法はありますか?

26
amcdnl

2つの選択肢があります

  1. コントローラーをauthorize属性で装飾することによるコントローラーレベル。

    [Authorize]
    [RoutePrefix("api/account")]
    public class AccountController : ApiController
    {
    
  2. WebApiConfig.csファイルのRegisterメソッドで、すべてのルートにグローバルレベルを設定することもできます。

     config.Filters.Add(new AuthorizeAttribute());
    
49
ssilas777

以下のようにAuthorizeAttributeWebApiConfigファイルに設定できます。

public static void Register(HttpConfiguration config)
{
  config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
  );
  config.Filters.Add(new AuthorizeAttribute());
}

これで、Web Apiコントローラーのすべてのメソッドに認証が必要になります。メソッドのこの承認要件を削除する場合は、ログインアクションメソッドのように属性[AllowAnonymous]を追加する必要があります。

21
Lin

私はあなたが使うなら他の答えに何かを追加したかっただけです

 filters.Add(container.Resolve<AuthorizeAttribute>());

必要がある場合は、属性にすべての依存関係を挿入することもできます

1
samira riazati