Ich habe eine API in asp.net core 2.0 erstellt, in der ich die Authentifizierung im gemischten Modus verwende. Für einige Controller JWT und für einige mit Windows-Authentifizierung.
Ich habe kein Problem mit den Controllern, die mit JWT autorisieren. Aber für die Controller, auf denen ich Windows-Authentifizierung verwenden möchte, werde ich auf unbestimmte Zeit mit Benutzernamen und Passwort-Dialogfeld von Chrome aufgefordert.
Hier mein Beispiel-Controller-Code, in dem ich Windows-Authentifizierung anstelle von JWT verwenden möchte.
[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = "Windows")]
public class TestController : Controller
{
[HttpPost("processUpload")]
public async Task<IActionResult> ProcessUploadAsync(UploadFileModel uploadFileModel)
{
}
}
Mein Dienstecode konfigurieren
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();
}
Meine configure-Methode.
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();
}
Schätzen Sie Ihre Vorschläge und helfen Sie dabei.
Update: Bis jetzt habe ich meinen Code auf Chrome getestet. Aber wenn ich IE 11 verwendet habe, läuft der obige Code ohne Probleme.
Kann dies eine CORS-Ausgabe von chrome where preflight issue sein?
Vielen Dank
Sie müssen sicherstellen, dass Sie NICHT Authorization: Bearer <JWT_token>
HTTP-Header, wenn Sie versuchen, Windows Auth zu verwenden. Der entscheidende Punkt hierbei ist, wie "Windows Auth" tatsächlich funktioniert. Schauen wir uns zum Beispiel an, wie es mit dem Browser funktioniert.
Nennen wir dies "einen normalen Ablauf":
http://example.com/api/resource
in Ihrem Browser;http://example.com/api/resource
ohne Authorization
HTTP-Header für den Moment (eine anonyme Anfrage);Authorization
Header gibt und antworten mit 401 Not Authorized
Statuscode mit WWW-Authenticate: NTLM,Negotiate
HTTP-Header eingerichtet ( "Geh weg, kein anonymer Zugriff. Nur 'NTLM'- oder' Negotiate'-Leute sind willkommen!" ) ;401
Antwort, finde heraus, dass die Anfrage anonym war, schaut nach WWW-Authenticate
Header und Anfrage sofort wiederholen, jetzt mit Authorization: NTLM <NTLM_token>
HTTP Header ( "Okay, machen Sie es sich gemütlich, Herr Webserver! Hier ist mein NTLM-Token." );Authorization
, überprüft es und führt die Anfrage aus ( "Ok, Sie können übergeben. Hier ist Ihre resource. ").Etwas anders sieht es aus, wenn Sie Authorization
header initial auf einen Wert setzen:
http://example.com/api/resource
mit JWT-Genehmigung;http://example.com/api/resource
mit Authorization: Bearer <JWT_token>
HTTP Header jetzt;Authorization
Header mit "Bearer" -Authentifizierungsschema gibt, und antworten Sie erneut mit 401 Not Authorized
Statuscode mit WWW-Authenticate: NTLM,Negotiate
HTTP-Header eingerichtet ( "Geht weg, wir wissen nicht, wer diese 'Träger'-Typen sind, aber wir mögen sie nicht. Nur' NTLM 'oder' Verhandeln 'Jungs sind willkommen! ");401
Antwort, stellen Sie fest, dass die Anforderung war autorisiert ist, und entscheiden Sie, dass dieses Token fehlerhaft ist. Wenn Sie jedoch den Header Authorization
festlegen, bedeutet dies, dass Sie tatsächlich einige Anmeldeinformationen haben. In diesem Dialogfeld werden Sie nach diesen Anmeldeinformationen gefragt.