Wir haben OAuth mit IndentityServer und Owin selbst gehosteten Web-APIs implementiert. Immer wenn ein Client versucht, auf unsere authentifizierten Endpunkte zuzugreifen, verwenden wir die Middleware Microsoft.Owin.Security.OpenIdConnect, um den Anruf zur Authentifizierung an den IndentityServer abzufangen und umzuleiten. Im Falle eines API-Aufrufs wollen wir nicht 302, sondern einen 401 mit einem Location-Header mit der URL des IdentityServers zurückgeben. Wir können die OWIN Middleware erhalten einen 401 zurück durchHinzufügen von Standortheader bei Antwort von Microsoft.Owin.Security.OpenIdConnect Middleware
AuthenticationMode = AuthenticationMode.Passive
Einstellung, aber wir sind nicht in der Lage einen Location-Header hinzuzufügen. Wie schaffen wir das? Wir haben versucht, den Header zu setzen (siehe Code unten), aber es funktioniert nicht. Es scheint, dass die Antwort intern von der Middleware erstellt wird.
appBuilder.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = idSrvUri.ToString(),
AuthenticationType = WebServiceConstants.OAuthAuthType,
ClientId = "beocloud",
Scope = "openid profile roles",
ResponseType = "id_token token",
AuthenticationMode = AuthenticationMode.Passive,
SignInAsAuthenticationType = WebServiceConstants.OAuthAuthType,
UseTokenLifetime = false,
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.AuthenticationRequest)
{
n.ProtocolMessage.RedirectUri = n.Request.Scheme + "://" + n.Request.Host + "/";
n.Response.Headers.Add("Location", new []{n.ProtocolMessage.CreateAuthenticationRequestUrl()});
}
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
{
var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");
if (idTokenHint != null)
{
n.ProtocolMessage.IdTokenHint = idTokenHint.Value;
}
}
return Task.FromResult(0);
}
}
});
}