web-dev-qa-db-ja.com

JWTとWindows認証のASP.Net Core 2.0混合認証は資格情報を受け入れません

混合モード認証を使用しているasp.netコア2.0でAPIを作成しました。一部のコントローラーJWTおよび一部のWindows認証を使用します。

JWTで認証するコントローラーに問題はありません。しかし、Windows認証を使用するコントローラーの場合、Chromeのユーザー名とパスワードのダイアログが無限に表示されます。

ここで、JWTの代わりにWindows認証を使用するサンプルコントローラーコード。

[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = "Windows")]
public class TestController : Controller
{
    [HttpPost("processUpload")]
    public async Task<IActionResult> ProcessUploadAsync(UploadFileModel uploadFileModel)
    {

    }
}

サービス設定コード

public void ConfigureServices(IServiceCollection services)
{
     services.AddAuthentication(options =>
     {
        options.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     })
     .AddJwtBearer("Bearer", options =>
     {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false,       
            ValidateIssuer = false,  
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("blahblahKey")),
            ValidateLifetime = true, //validate the expiration and not before values in the token
            ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date
        };
     });

     // let only my api users to be able to call 
     services.AddAuthorization(auth =>
     {
        auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
            .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
            .RequireClaim(ClaimTypes.Name, "MyApiUser").Build());
     });

     services.AddMvc();
}

私の設定方法。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("CorsPolicy");

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseAuthentication(); //needs to be up in the pipeline, before MVC
    app.UseMvc();
}

あなたの提案に感謝し、これについて助けてください。

更新:今まで、クロムでコードをデバッグしてきました。しかし、IE 11を使用すると、上記のコードは問題なく実行されます。

これはchrome where preflight issue?

ありがとう

13
coolcake

[〜#〜] not [〜#〜] Windows Authを使用しようとするときにAuthorization: Bearer <JWT_token> HTTPヘッダーを設定することを確認する必要があります。ここで重要なのは、「Windows Auth」が実際にどのように機能するかです。たとえば、ブラウザでどのように機能するか見てみましょう。

これを「通常のフロー」と呼びましょう。

  1. ブラウザでhttp://example.com/api/resourceに移動します。
  2. ブラウザーは、Authorization HTTPヘッダー(匿名リクエスト)なしでHTTP GETリクエストをhttp://example.com/api/resourceに送信します。
  3. Webサーバー(またはWebAPI自身)がリクエストを受信し、Authorizationヘッダーがないことを確認し、401 Not Authorized HTTPヘッダーが設定されたWWW-Authenticate: NTLM,Negotiateステータスコードで応答しますup( "離れて、匿名アクセスなし。「NTLM」または「ネゴシエート」の人だけが歓迎されます!」);
  4. ブラウザは401応答を受信し、リクエストが匿名であることを確認し、WWW-Authenticateヘッダーを探してすぐにリクエストを繰り返しますAuthorization: NTLM <NTLM_token> HTTPヘッダー(「わかりました、Webサーバーさん、どうぞ!ここに私のNTLMトークンがあります。」);
  5. サーバーは2番目のリクエストを受信し、AuthorizationヘッダーでNTLMトークンを見つけ、それを確認してリクエストを実行します( "リソース。」)。

Authorization headerを何らかの値に初期設定すると、状況は少し異なります。

  1. JSには、http://example.com/api/resourceとJWT認証が必要です。
  2. ブラウザはhttp://example.com/api/resource HTTPヘッダーを使用して、HTTP GETリクエストをAuthorization: Bearer <JWT_token>に送信します。
  3. Webサーバー(またはWebAPI自身)は、リクエストを受け取り、「Authorization」「ベアラー」認証スキームのヘッダーがあることを確認し、再び401 Not AuthorizedのステータスコードWWW-Authenticate: NTLM,Negotiateで応答します HTTPヘッダーのセットアップ()「去り、この「ベアラー」の人は誰なのかわかりませんが、好きではありません。「NTLM」または「ネゴシエート」のみみんな大歓迎です! ");
  4. ブラウザは401応答を受信し、その要求wasが許可されていることを確認し、このトークンが不良であると判断します。しかし、実際にAuthorizationヘッダーを設定すると、これは実際にhave資格情報を意味します。そのため、このダイアログでこの資格情報を要求します。
21
vasily.sib