1

私は最近、Visual Studio 2012 で OWIN ミドルウェアを使用して OAuth2 でユーザーを認証する Web API 2 プロジェクトを開始しました。このチュートリアル (トークンベースの認証)で概説されているように、トークンベースの認証を組み込みました。認証部分はうまく機能します。API のテスト メソッドをいくつか追加し、API ドキュメント用に Swagger を接続したいと考えました。Swagger からの API 呼び出しが承認時に失敗することを除いて、その部分も機能しました。

調査の結果、 Swagger を OWIN ミドルウェアに接続する方法に関するErik Dahl の投稿を見つけました。投稿に従って Swagger を構成した後、Swagger UI の各 API メソッドの横に認証ボタンが表示されるようになりました。ただし、認証を試みる場合、Swagger 内の認証は GET 要求を使用して行われます。ただし、Web API での認証では、POST 要求である必要があります。認証要求を POST にするように Swagger を構成することは可能ですか? そうでない場合、API がトークン認証の GET 要求を受け入れることを許可する必要がありますか? これを機能させるための最良のアプローチは何ですか?

注: リクエストは引き続き認証ロジックにヒットしますが、client_id と client_secret は GET リクエストでは渡されず、POST リクエストでのみ渡されます。

これが私のSwagger構成です:

httpConfig
    .EnableSwagger(c =>
    {
        c.SingleApiVersion("v1", "Sample API");

        c.ApiKey("token")
            .Description("API Key Authentication")
            .Name("Bearer")
            .In("header");

        c.OAuth2("oauth2")
            .AuthorizationUrl("/oauth/token")
            .Flow("implicit")
            .Description("OAuth2 authentication")
            .Scopes(scopes =>
            {
                scopes.Add("sampleapi", "Sample API");
            });


        c.OperationFilter<AssignOAuth2SecurityRequirements>();
    })
    .EnableSwaggerUi(c =>
    {
        c.EnableOAuth2Support(
            clientId: "Sample_App",
            clientSecret: "xxxxx",
            realm: "test-realm",
            appName: "Swagger UI");
    });

そして、ここに私のOAuth構成があります:

app.CreatePerOwinContext<ApiClientRepo>(ApiClientRepo.Create);
app.CreatePerOwinContext<MeetingRegistrantRepo>(MeetingRegistrantRepo.Create);

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    //For Dev enviroment only (on production should be AllowInsecureHttp = false)
    AllowInsecureHttp = true,
    TokenEndpointPath = new PathString("/oauth/token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
    Provider = new CustomOAuthProvider(),
    AccessTokenFormat = new CustomJwtFormat("http://localhost:51071"),
    RefreshTokenProvider = new SimpleRefreshTokenProvider()
};

// OAuth 2.0 Bearer Access Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
4

1 に答える 1

1

いいえ、Swagger を満たすためだけに認証方法を POST から GET に変更するつもりはありません。

ここでやりたいことを行うのに役立つ別の記事を見つけました:http://danielwertheim.se/use-identityserver-in-swaggerui-to-consume-a-secured-asp-net-webapi/

そんな風にやってみる価値はあるでしょう。POST から GET に変更すると、リクエストの本文でパラメーターを渡すことができなくなり、代わりにリクエストの URL でパラメーターを渡す必要があり、全体が安全でなくなることを忘れないでください。

はい、ClientID と ClientSecret は引き続き Authorization ヘッダーの一部になりますが、このようなことを受け入れることはできません。Swagger は API のアーキテクチャを決定するべきではないので、そこには行かないでください。

于 2016-06-30T10:14:30.157 に答える