[解決済み] Asp.net WebApiのカスタム認証 - なんてことするんだ?
質問
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を見てみてください。 記事 . 免責事項:これは私によって書かれたものです。
関連
-
ASP.NET Core Dependency Injectionフレームワークの活用
-
swagger uiをasp.net coreに統合する原理
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み] 認証と認可
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] ASP.NET CoreでカスタムのAuthorizeAttributeを作成する方法は?
-
[解決済み】ASP.NET WebAPIでファイル(FileContentResult)を返す方法
-
[解決済み】ASP.NET Web APIを使用したセッションへのアクセス
-
[解決済み] ASP.NETの新しいセキュリティ脆弱性の深刻度と回避方法について教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.NET 6:.NETのロギングコンポーネントlog4netを使用する。
-
swagger uiをasp.net coreに統合する原理
-
Net CoreによるAutoFacの利用
-
非同期タスクキャンセルと監視のネット実装
-
[解決済み】ASP.NET web.config: configSourceとファイル属性の比較
-
[解決済み] web.configの変換で "Replace Or Insert "を行う方法はありますか?
-
[解決済み] ASP.NETの一時ファイルのクリーンアップ
-
[解決済み] IIS7.5とASP.NET v2によるWebアプリケーションの問題(web.configエラー)HTTP 500.19
-
[解決済み] ASP.NET Web APIでのユーザー認証
-
[解決済み] ASP.NET MVCのHtml.ActionLinkに "active "クラスを追加する方法