1. ホーム
  2. asp.net

[解決済み] Asp.net WebApiのカスタム認証 - なんてことするんだ?

2022-08-30 19:10:14

質問

WebApiの認証について、いくつかの資料(書籍やSOアンサー)を読んでいます。

例えば、私は特定のユーザーのみアクセスを許可するカスタム属性を追加したいとします。

ケース1

私は、このようなアプローチで オーバーライド OnAuthorization これは、何か問題があった場合にレスポンスを設定する

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 public override void OnAuthorization(HttpActionContext actionContext)
  {
   if ( /*check if user OK or not*/)
   {
     actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
   }
  }
}

ケースその2

しかし、私はこの似たような例を見たことがあります。 OnAuthorization をオーバーライドしていますが base :

public override void OnAuthorization(HttpActionContext actionContext) 
{ 
  base.OnAuthorization(actionContext);

    // If not authorized at all, don't bother

    if (actionContext.Response == null)  
     {
      //...
     }
}

次に HttpActionContext.Response が設定されているかどうかを調べます。もし設定されていなければ、それはリクエストが承認され、ユーザがOKであることを意味します

ケースその3

しかし、このようにオーバーライドするアプローチも見受けられます。 IsAuthorized :

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 protected override bool IsAuthorized(HttpActionContext context)
  {
   if ( /*check if user OK or not*/)
   {
    return true;// or false
   }
  }
}

ケース番号4

そして、似たような例を見ましたが、base.IsAuthorized(context)を呼び出しています。

protected override bool IsAuthorized(HttpActionContext context)
{
 if (something1 && something2 && base.IsAuthorized(context)) //??
 return true;
 return false;
}

もうひとつ

そして最後にドミニクはこう言った。 ここで :

OnAuthorization をオーバーライドしてはいけません - なぜなら [AllowAnonymous] の処理が欠落してしまうからです。

質問

  • 1) どのメソッドを使用すればよいか : IsAuthorized または OnAuthorization ? ( あるいは、いつどちらを使うか)

  • 2) どのような場合に base.IsAuthorized or base.OnAuthorization` を呼び出しますか?

  • 3) これは彼らがそれを構築した方法ですか? レスポンスがヌルである場合、すべてがOKであること?( ケース #2)

NB

私が使っている(そして使いたい)のは AuthorizeAttribute を既に継承している AuthorizationFilterAttribute

なぜ?

私は今、...の最初の段階にいるのです。 http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

とにかく、私は拡張Authorize属性を介して尋ねる。

どのように解決するには?

<ブロッククオート

IsAuthorizedとOnAuthorizationのどちらを使用すればよいですか?(または いつどちらを使うか)

を拡張することになります。 AuthorizationFilterAttribute を拡張することになります。ユーザ関連の権限付与については AuthorizeAttribute . 前者の場合は OnAuthorization . 後者の場合は IsAuthorized . これらの属性のソースコードからわかるように OnAuthorization から派生した場合、オーバーライドするために virtual とマークされています。 AuthorizationFilterAttribute . 一方 IsAuthorized メソッドでは virtual とマークされています。 AuthorizeAttribute . これは意図された使用法を示す良いポインタだと思います。

base.IsAuthorizedまたはbase.OnAuthorizationをいつ呼び出すべきですか?

この質問に対する答えは、OOが一般的にどのように機能するかにあります。メソッドをオーバーライドする場合、完全に新しい実装を提供するか、親が提供する実装におんぶに抱っこして動作を強化するかのどちらかになります。例えば IsAuthorized(HttpActionContext) . ベースクラスの動作は、ユーザー/ロールをフィルターで指定されたものと確立されたアイデンティティとで照合するものです。例えば、そのようなことをしたいが、さらにリクエストヘッダか何かに基づいて何か他のことをチェックしたいとします。その場合、次のようなオーバーライドを提供することができます。

protected override bool IsAuthorized(HttpActionContext actionContext)
{
    bool isAuthroized = base.IsAuthorized(actionContext);
    // Here you look at the header and do your additional stuff based on actionContext
    // and store the result in isRequestHeaderOk
    // Then, you can combine the results
    // return isAuthorized && isRequestHeaderOk;
}

申し訳ありませんが、あなたのQ3を理解することはできません。ところで、認証フィルタは長い間存在しており、人々はあらゆることにそれを使っていますし、時には間違っていることもあります。

もうひとつ。そして最後に、ここでこう言った人がいました。 OnAuthorizationをオーバーライドしてはいけません。 [AllowAnonymous]の処理が抜けてしまうからです。

それを言ったのは、アクセスコントロールの神様、ドミニクです。明らかに正しいでしょう。の実装を見てみると OnAuthorization (下にコピーしてあります)を見てください。

public override void OnAuthorization(HttpActionContext actionContext)
{
    if (actionContext == null)
    {
        throw Error.ArgumentNull("actionContext");
    }

    if (SkipAuthorization(actionContext))
    {
        return;
    }

    if (!IsAuthorized(actionContext))
    {
        HandleUnauthorizedRequest(actionContext);
    }
}


への呼び出しは SkipAuthorization を確実にする部分です。 AllowAnonymous のフィルタが適用されるようにする部分です。つまり、認証はスキップされます。このメソッドをオーバーライドすると、その動作は失われます。実は、もしあなたがユーザー/ロールに基づいて認可を行うことに決めたのなら、 その時点で AuthorizeAttribute . その時点であなたに残された唯一の正しい選択肢は、オーバーライドすることでしょう。 IsAuthorized であり、すでにオーバーライドされている OnAuthorization でなく、すでにオーバーライドされている を使用します。

追記 ASP.NET Web APIでは、認証フィルタという別のフィルタがあります。その名の通り、認証にはそれを使い、認可には認可フィルタを使うという考えです。しかし、この境界線がごまかされている例がたくさんあります。多くの認証フィルタの例は、何らかの認証を行います。とにかく、もし時間があってもう少し理解したいのであれば、このMSDNを見てみてください。 記事 . 免責事項:これは私によって書かれたものです。