2016-08-11 2 views
5

私はASP.NET Web APIでSwashbuckleとSwaggerを使用しています。私はスワッガーUIを通じてベアラートークンを含むAuthorizationヘッダーを渡す方法を見つけようとしています。私は周りを探索してきましたが、すべての答えはthisリンクを指しているようです。Swagger UI:pass custom承認ヘッダー

ただし、これはヘッダーの内容が既知であることを前提としています。ベアラートークンが1時間ごとに有効期限が切れるので、Swagger UI内のヘッダーを変更する方法が本当に必要です(「試してみてください」ボタンを押す直前)。郵便配達人があなたにヘッダーを加えることを許す方法と同様の何か。

このようなばかばかしい問題のようですが、答えは何ですか?

答えて

13

public class AddRequiredHeaderParameter : IOperationFilter { 

    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { 
     if (operation.parameters == null) { 
      operation.parameters = new List<Parameter>(); 
     } 

     operation.parameters.Add(new Parameter { 
      name = "Foo-Header", 
      @in = "header", 
      type = "string", 
      required = true 
     }); 
    } 
} 

そして、そのように私のSwaggerConfigにクラスを追加しました。また、ヘッダーパラメータをSwagger UI Webサイトに追加したいと思っていました。これが私たちのやり方です:

1。OperationFilterクラスの定義 OperationFiltersは、SwaggerをビルドするたびにすべてのAPI操作で実行されます。あなたのコードに従って、操作はあなたのフィルターに従ってチェックされます。この例では、すべての操作で必要なヘッダーパラメーターを作成しますが、AllowAnonymous属性を持つ操作ではオプションにします。

public class AddAuthorizationHeader : IOperationFilter 
{ 
    /// <summary> 
    /// Adds an authorization header to the given operation in Swagger. 
    /// </summary> 
    /// <param name="operation">The Swashbuckle operation.</param> 
    /// <param name="schemaRegistry">The Swashbuckle schema registry.</param> 
    /// <param name="apiDescription">The Swashbuckle api description.</param> 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     if (operation == null) return; 

     if (operation.parameters == null) 
     { 
      operation.parameters = new List<Parameter>(); 
     } 

     var parameter = new Parameter 
     { 
      description = "The authorization token", 
      @in = "header", 
      name = "Authorization", 
      required = true, 
      type = "string" 
     }; 

     if (apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) 
     { 
      parameter.required = false; 
     } 

     operation.parameters.Add(parameter); 
    } 
} 

2.ちょうど次のように操作フィルタを使用することを追加し、SwaggerConfigではこのOperationFilter を使用するように闊歩教える:

c.OperationFilter<AddAuthorizationHeader>(); 

希望、これはあなたを助け!

+0

Swashbuckleの最新バージョンはOperationクラスを変更してパラメータフィルタクラスを削除したようですが、何かご意見は? –

+0

私はそのフィルタを作成して、私のすべてのアクションがそれを求めるのですか?コントローラのアクションを除外するにはどうしたらいいですか? –

1

Authorizationヘッダーの収集方法と、コードですべてを処理するかどうか、またはユーザーがAuthorizationヘッダーを入力できるようにするかどうかによって、さまざまな方法で行うことができます。

これを初めて試したときに、Authorizationヘッダーテキストを各エンドポイントのパラメータフィールドエリアに表示することができました。ここでユーザーはAuthorizationヘッダーを入力できますが、これは私が望むものではありませんでした。

私の状況では、有効なAuthorizationトークンを取得するために、ユーザーのクッキーを使用して/tokenエンドポイントに要求を送信しなければなりませんでした。だから私はこれを達成するためにさまざまなことをしました。

私はAPIのスキーマに、基本的な認証スキームを取得するためにc.BasicAuth()をコメント解除し、私も、私は、ユーザーのCookieを使用して、Authorizationトークンをつかむために、AJAX要求を挿入するカスタムindex.htmlページ(index.htmlコード示すを注入しSwaggerConfig.csで初以下):

public static void Register() { 

    System.Reflection.Assembly thisAssembly = typeof(SwaggerConfig).Assembly; 

    System.Web.Http.GlobalConfiguration.Configuration 
       .EnableSwagger(c => { 
        ... 

        c.BasicAuth("basic").Description("Bearer Token Authentication"); 

        ... 
       }) 
       .EnableSwaggerUi(c => { 
        ... 

        c.CustomAsset("index", thisAssembly, "YourNamespace.index.html"); 

        ... 
       }); 
} 

その後、我々はAuthorizationヘッダを挿入するようにカスタマイズしますswashbuckle index.htmlをダウンロードするhereを率います。私は単に、有効なクッキーと私の/tokenエンドポイントへのAJAX呼び出しを行うAuthorizationトークンを取得し、window.swaggerUi.api.clientAuthorizations.add()で使用する闊歩してそれを与える以下

私はAJAXからいくつかのことを取り除きますよりシンプルにするために呼び出すと、あなたの実装はおそらくあなたのAuthorizationトークンやものをどのように集めるかによって異なるでしょうが、それはあなたにアイデアを与えます。特定の問題や質問がある場合は、教えてください。

*編集:実際にユーザーがAuthorizationヘッダーを入力してもらいたいと思わなかったかどうか。その場合は非常に簡単です。私はthisポストを使用しました。単純に仕事をするために以下のクラスを作成しました:私たちは私たちのプロジェクトで同じ問題に遭遇した

... 
c.OperationFilter<AddRequiredHeaderParameter>(); 
... 
+0

ご回答ありがとうございます。私はあなたが言及する最初のことに興味があります。つまり、「これを初めて試したときに、ユーザーが認証ヘッダーに入力できる各エンドポイントのパラメータフィールド領域にAuthorizationヘッダーテキストを表示することができました」。どうしたの?質問に記載されているように、私はユーザーにAuthorizationヘッダーを入力させたいが、承認ヘッダーが自動的に入力されないようにしたい。 – fikkatra

+0

@fikkatra申し訳ありませんが、私はそれを見逃しました。編集を参照してください。 – hvaughan3

1

IOperationFilterを実装する新しい操作フィルターを作成します。

public class AuthorizationHeaderOperationFilter : IOperationFilter 
{ 
    /// <summary> 
    /// Adds an authorization header to the given operation in Swagger. 
    /// </summary> 
    /// <param name="operation">The Swashbuckle operation.</param> 
    /// <param name="context">The Swashbuckle operation filter context.</param> 
    public void Apply(Operation operation, OperationFilterContext context) 
    { 
     if (operation.Parameters == null) 
     { 
      operation.Parameters = new List<IParameter>(); 
     } 

     var authorizeAttributes = context.ApiDescription 
      .ControllerAttributes() 
      .Union(context.ApiDescription.ActionAttributes()) 
      .OfType<AuthorizeAttribute>(); 
     var allowAnonymousAttributes = context.ApiDescription.ActionAttributes().OfType<AllowAnonymousAttribute>(); 

     if (!authorizeAttributes.Any() && !allowAnonymousAttributes.Any()) 
     { 
      return; 
     } 

     var parameter = new NonBodyParameter 
     { 
      Name = "Authorization", 
      In = "header", 
      Description = "The bearer token", 
      Required = true, 
      Type = "string" 
     }; 

     operation.Parameters.Add(parameter); 
    } 
} 

Startup.csファイルでサービスを設定します。

 services.ConfigureSwaggerGen(options => 
     { 
      options.OperationFilter<AuthorizationHeaderOperationFilter>(); 
     }); 
関連する問題