混合モード認証を使用している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?
ありがとう
[〜#〜] not [〜#〜] Windows Authを使用しようとするときにAuthorization: Bearer <JWT_token>
HTTPヘッダーを設定することを確認する必要があります。ここで重要なのは、「Windows Auth」が実際にどのように機能するかです。たとえば、ブラウザでどのように機能するか見てみましょう。
これを「通常のフロー」と呼びましょう。
http://example.com/api/resource
に移動します。Authorization
HTTPヘッダー(匿名リクエスト)なしでHTTP GETリクエストをhttp://example.com/api/resource
に送信します。Authorization
ヘッダーがないことを確認し、401 Not Authorized
HTTPヘッダーが設定されたWWW-Authenticate: NTLM,Negotiate
ステータスコードで応答しますup( "離れて、匿名アクセスなし。「NTLM」または「ネゴシエート」の人だけが歓迎されます!」);401
応答を受信し、リクエストが匿名であることを確認し、WWW-Authenticate
ヘッダーを探してすぐにリクエストを繰り返しますAuthorization: NTLM <NTLM_token>
HTTPヘッダー(「わかりました、Webサーバーさん、どうぞ!ここに私のNTLMトークンがあります。」);Authorization
ヘッダーでNTLMトークンを見つけ、それを確認してリクエストを実行します( "リソース。」)。Authorization
headerを何らかの値に初期設定すると、状況は少し異なります。
http://example.com/api/resource
とJWT認証が必要です。http://example.com/api/resource
HTTPヘッダーを使用して、HTTP GETリクエストをAuthorization: Bearer <JWT_token>
に送信します。Authorization
」「ベアラー」認証スキームのヘッダーがあることを確認し、再び401 Not Authorized
のステータスコードWWW-Authenticate: NTLM,Negotiate
で応答します HTTPヘッダーのセットアップ()「去り、この「ベアラー」の人は誰なのかわかりませんが、好きではありません。「NTLM」または「ネゴシエート」のみみんな大歓迎です! ");401
応答を受信し、その要求wasが許可されていることを確認し、このトークンが不良であると判断します。しかし、実際にAuthorization
ヘッダーを設定すると、これは実際にhave資格情報を意味します。そのため、このダイアログでこの資格情報を要求します。