Asp.Net Web API に Swagger を実装しようとしていますが、問題が発生しています。
私はパスワード リソース オーナー フローを使用しています。これを行うには回避策を追加する必要があります。これについては、次のスタック オーバーフローの質問で説明します。
Swagger/Swashbuckle: OAuth2 とリソース所有者のパスワード認証情報付与
すべてが機能しています。ベアラー トークンは JavaScript を介して現在のブラウザー ウィンドウのリクエスト ヘッダーに追加されますが、承認を必要とするコントローラー メソッドへの API 呼び出しは「401 - 承認に失敗しました」を返します。
ベアラー トークンを取得してヘッダーを追加する JavaScript は次のとおりです。
$('#input_apiKey').change(function () {
var key = $('#input_apiKey')[0].value;
var credentials = key.split(':'); //username:password expected
$.ajax({
url: "http://localhost:42291/token",
type: "post",
contenttype: 'x-www-form-urlencoded',
data: "grant_type=password&username=" + credentials[0] + "&password=" + credentials[1],
success: function (response) {
var bearerToken = 'Bearer ' + response.access_token;
window.swaggerUi.api.clientAuthorizations.add('Authorization', new window.SwaggerClient.ApiKeyAuthorization('Authorization', bearerToken, 'header'));
window.swaggerUi.api.clientAuthorizations.remove('api_key');
alert("Login Succesfull!");
},
error: function (xhr, ajaxoptions, thrownerror) {
alert("Login failed!");
}
});
});
Swagger の応答の Curl は次のとおりです。
curl -X GET --header "Accept: application/json" --header "Authorization: Bearer NqlSG-WyTx2zkYE8xFklGyZWlQDZdsCKZBHruEXvX47N7PAzw4-jZ4eH5D0yFzQTXj13RwKFFt1rUZt2fzWj1vR5UR87wdlKC3YvsTojYV4-3DsWwY7qYRfiKPuM0j09c3X5lnrtlBVJ1rBRUH0TLjfw_yGxgoLBwOJl9xyC1YWNoPOe2nzL4lMOHodAnMem0IBMJmUo3Rt575tnWAbBsQXWhlImDIxCZXvkZdJtlXfIfBSUdY9gfRWL0ZjKbf7m2-yLzH0gpMAMuKaADmJlIudJc0d4SP1Nn2Kh2HuVH8CX4QgZuu4egl9N6rY2smorP2vBSC4_dC4CpmYYzOTu2wUnUhHDY2Q6NWl377ijDKwZLcW9jtD-2tBiEGmFuRV0mVGnh0zc4w9Ao9jPCdtrbSyGitgloBW-UG2bfyao3eE" " http://localhost:42291/api/v1/claims "
これにはまったく問題がありません。
次に、Postman を使用して、javascript 呼び出しで生成されたのと同じアクセス トークンを使用して、まったく同じ URL 呼び出しを呼び出しました...
何を推測します...それはうまくいきます。
編集
コントローラーから認証属性を削除しようとしたので、コントローラーメソッドにヒットしたときにリクエストを確認できます。
要求ヘッダーを見ると、Authorization プロパティは null です。
これがなぜなのかわかりません。CURL は、リクエストに配置されたことを示しています。
編集2
私のセキュリティ定義を含めました:-
"securityDefinitions": {
"oauth2": {
"type": "oauth2",
"description": "OAuth2 Password Grant",
"flow": "password",
"tokenUrl": "http://localhost:42291/token",
"scopes": {}
}
}
編集 3 この API 呼び出しの Swagger UI に表示される cURL は、コマンド ラインで直接 cURL を介して公開すると、問題なく動作します。
今、私は完全に混乱しています。