ASP.NET Core 1.0でREST APIを作成しています。私はSwaggerを使ってテストしていましたが、今ではいくつかのルートでJWT認可を追加しました。 (UseJwtBearerAuthentication
)ASP.NET Core 1.0でSwaggerでJWT(Authorization:Bearer)を使用
[Authorize]
属性のルートをテストできるようにスワッガー要求のヘッダーを変更することはできますか?
ASP.NET Core 1.0でREST APIを作成しています。私はSwaggerを使ってテストしていましたが、今ではいくつかのルートでJWT認可を追加しました。 (UseJwtBearerAuthentication
)ASP.NET Core 1.0でSwaggerでJWT(Authorization:Bearer)を使用
[Authorize]
属性のルートをテストできるようにスワッガー要求のヘッダーを変更することはできますか?
私は同じ問題で苦労して、このブログ投稿で実用的なソリューションを見つけました: http://blog.sluijsveld.com/28/01/2016/CustomSwaggerUIField
それがダウンしてあなたのconfigurationoptionsに
services.ConfigureSwaggerGen(options =>
{
options.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
});
とoperationfilter
のためのコードを、これを追加することになりますpublic class AuthorizationHeaderParameterOperationFilter : IOperationFilter
{
public void Apply(Operation operation, OperationFilterContext context)
{
var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors;
var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter);
var allowAnonymous = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);
if (isAuthorized && !allowAnonymous)
{
if (operation.Parameters == null)
operation.Parameters = new List<IParameter>();
operation.Parameters.Add(new NonBodyParameter
{
Name = "Authorization",
In = "header",
Description = "access token",
Required = true,
Type = "string"
});
}
}
}
次に、toggerに追加のAuthorization TextBoxが表示されますnを 'Bearer {jwttoken}'の形式で入力してください。
私のために働いてくれたHansVGの回答を拡大してください(感謝)、私は十分な貢献点を持っていないので、直接emseeteaの質問に答えることはできません。承認テキストボックスを取得したら、エンドポイントの必須[認証]領域外にあるトークンを生成するエンドポイントを呼び出す必要があります。
エンドポイントからトークンを生成するようにそのエンドポイントを呼び出すと、そのエンドポイントの結果からトークンをコピーできます。それから、[認可]する必要がある他の領域で使用するトークンがあります。テキストボックスに貼り付けてください。 HansVGが述べたように、「ベアラ」を含む必要がある正しい形式で追加するようにしてください。フォーマット= "ベアラ{トークン}"。
現在、SwaggerはJWT-tokenとの認証機能を備えており、自動的にヘッダーにトークンを追加できます(私はSwashbuckle.AspNetCore 1.1.0を使用しています)。
次のコードは、これを達成するのを助ける必要があります。 Startup.ConfigureServices()で
:
services.AddSwaggerGen(c =>
{
// Your custom configuration
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
c.DescribeAllEnumsAsStrings();
// JWT-token authentication by password
c.AddSecurityDefinition("oauth2", new OAuth2Scheme
{
Type = "oauth2",
Flow = "password",
TokenUrl = Path.Combine(HostingEnvironment.WebRootPath, "/token"),
// Optional scopes
//Scopes = new Dictionary<string, string>
//{
// { "api-name", "my api" },
//}
});
});
チェックして、エンドポイントが異なる場合TokenUrlを設定します。 Startup.Configureで
():
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "API V1");
// Provide client ID, client secret, realm and application name (if need)
c.ConfigureOAuth2("swagger-ui", "swagger-ui-secret", "swagger-ui-realm", "Swagger UI");
});
トークンによる認証のためのあなたのエンドポイントがのOAuth2標準に従った場合は、すべてが動作するはずです。ただし、このエンドポイントのサンプルを追加しました。
public class AccountController : Controller
{
[ProducesResponseType(typeof(AccessTokens), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
[HttpPost("/token")]
public async Task<IActionResult> Token([FromForm] LoginModel loginModel)
{
switch (loginModel.grant_type)
{
case "password":
var accessTokens = // Authentication logic
if (accessTokens == null)
return BadRequest("Invalid user name or password.");
return new ObjectResult(accessTokens);
case "refresh_token":
var accessTokens = // Refresh token logic
if (accessTokens == null)
return Unauthorized();
return new ObjectResult(accessTokens);
default:
return BadRequest("Unsupported grant type");
}
}
}
public class LoginModel
{
[Required]
public string grant_type { get; set; }
public string username { get; set; }
public string password { get; set; }
public string refresh_token { get; set; }
// Optional
//public string scope { get; set; }
}
public class AccessTokens
{
public string access_token { get; set; }
public string refresh_token { get; set; }
public string token_type { get; set; }
public int expires_in { get; set; }
}
これは、UserId/Password/Client/Secretが失敗した場合を除き、バックグラウンドで静かに失敗し、ログインしたままになります。 – Whoever
承認が失敗した場合は、HTTPステータスコード400が返されることを確認してください。それはRFC 6749からの要件であり、Swaggerもそれを処理します。私は答えを更新しました。 –
はい、私はIdentityServer 4を使用して400を返します。しかし、ユーザーのログインに成功したかのように、UIにはログアウトボタンが表示されます。認証を表示するためのスワッガーポップアップ画面を設定する方法がわかりません。 – Whoever
ここで、swagger UIで試用機能を使用する場合、ベアラトークンを取得してjwttokenフィールドに入れますか? – emseetea
ちょうど速いヘルパー。 Microsoft.AspNetCore.Mvc.Authorizationを使用しています。 Swashbuckle.AspNetCore.Swaggerを使用しています。 Swashbuckle.AspNetCoreを使用しています。SwaggerGen; using System.Collections.Generic; using System.Linq; – statler