2016-08-05 13 views
10

ASP.NET Core 1.0でREST APIを作成しています。私はSwaggerを使ってテストしていましたが、今ではいくつかのルートでJWT認可を追加しました。 (UseJwtBearerAuthenticationASP.NET Core 1.0でSwaggerでJWT(Authorization:Bearer)を使用

[Authorize]属性のルートをテストできるようにスワッガー要求のヘッダーを変更することはできますか?

答えて

16

私は同じ問題で苦労して、このブログ投稿で実用的なソリューションを見つけました: 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}'の形式で入力してください。

+0

ここで、swagger UIで試用機能を使用する場合、ベアラトークンを取得してjwttokenフィールドに入れますか? – emseetea

+0

ちょうど速いヘルパー。 Microsoft.AspNetCore.Mvc.Authorizationを使用しています。 Swashbuckle.AspNetCore.Swaggerを使用しています。 Swashbuckle.AspNetCoreを使用しています。SwaggerGen; using System.Collections.Generic; using System.Linq; – statler

2

私のために働いてくれたHansVGの回答を拡大してください(感謝)、私は十分な貢献点を持っていないので、直接emseeteaの質問に答えることはできません。承認テキストボックスを取得したら、エンドポイントの必須[認証]領域外にあるトークンを生成するエンドポイントを呼び出す必要があります。

エンドポイントからトークンを生成するようにそのエンドポイントを呼び出すと、そのエンドポイントの結果からトークンをコピーできます。それから、[認可]する必要がある他の領域で使用するトークンがあります。テキストボックスに貼り付けてください。 HansVGが述べたように、「ベアラ」を含む必要がある正しい形式で追加するようにしてください。フォーマット= "ベアラ{トークン}"。

1

現在、SwaggerはJWT-tokenとの認証機能を備えており、自動的にヘッダーにトークンを追加できます(私はSwashbuckle.AspNetCore 1.1.0を使用しています)。

enter image description here

次のコードは、これを達成するのを助ける必要があります。 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; } 
} 
+0

これは、UserId/Password/Client/Secretが失敗した場合を除き、バックグラウンドで静かに失敗し、ログインしたままになります。 – Whoever

+0

承認が失敗した場合は、HTTPステータスコード400が返されることを確認してください。それはRFC 6749からの要件であり、Swaggerもそれを処理します。私は答えを更新しました。 –

+0

はい、私はIdentityServer 4を使用して400を返します。しかし、ユーザーのログインに成功したかのように、UIにはログアウトボタンが表示されます。認証を表示するためのスワッガーポップアップ画面を設定する方法がわかりません。 – Whoever

関連する問題