2

古い API を使用する Web サービスがあります。ほとんどすべてのサービス ハンドラで認証が必要なため、サービス レベルで Authenticate 属性を使用します。

私のすべてのサービスは、OnBeforeExecute を使用していくつかの認証関連のプロパティを設定するカスタム ベース サービスを実装しています。

現在のリクエストのハンドラーが OnBeforeExecute メソッドで認証を必要とするかどうかを確認する簡単な方法はありますか?

これはかなり遅い操作であることがわかっているので、リフレクションを使用して属性を調べる必要はありません。また、ServiceStack システムはすでにこの情報を腹のどこかに持っていると思います :)


私がやったこと

私のプロジェクトには、Authenticate の ApplyTo 引数を使用して一部のハンドラーの認証要件を無効にするサービスがあるため、次のようになりました。

protected override void OnBeforeExecute(TRequestDto request)
{
    base.OnBeforeExecute(request);

    var attr = FilterAttributeCache.GetRequestFilterAttributes(request.GetType()).OfType<AuthenticateAttribute>().FirstOrDefault();
    if (attr != null)
    {
        ApplyTo reqmethod = base.Request.HttpMethodAsApplyTo();
        if ((attr.ApplyTo & reqmethod) == reqmethod)
        {
            //
            // do stuff that should only be done when 
            // the handler requires authentication
            //
        }
    }
}
4

1 に答える 1

2

認証要求フィルター属性について特別なことはありませんが、優先度が最も低いため最初に実行されます。

ServiceStack はRequest DTO が持つすべての属性のFilterAttributeCacheを維持するため、この API を使用して、AuthenticateAttribute が特定のサービスに対して定義されているかどうかを判断できます。

var hasAuth = FilterAttributeCache.GetRequestFilterAttributes(request.GetType())
   .OfType<AuthenticateAttribute>().FirstOrDefault() != null;
于 2013-03-06T13:33:00.260 に答える