openid - open - Saltar la pantalla de inicio de sesión de IdentityServer3
oauth2 server c# (3)
¡Acabo de encontrar la solución en la documentación del punto de autorización / autenticación de IdentityServer3 !
acr_values (opcional) permite pasar información adicional relacionada con la autenticación al servicio de usuario; también hay valores con un significado especial: idp: name_of_idp omite la pantalla de inicio de sesión / dominio de casa y reenvía al usuario directamente al proveedor de identidad seleccionado (si está permitido según la configuración del cliente ) inquilino: nombre_de_tenido puede usarse para pasar un nombre de inquilino al servicio de usuario
Cómo pasar parámetros adicionales utilizando el middleware OWIN OpenID Connect: katanaproject.codeplex.com/workitem/325
Aquí está la muestra de la solicitud de autorización:
Hemos configurado la aplicación cliente para usar la autenticación IdentityServer3 a través del protocolo OpenID Connect (es la aplicación MVC de ASP.NET que usa middleware OWIN para admitir OIDC).
El propio IdentityServer3 está configurado para usar tanto el inicio de sesión local como el inicio de sesión externo (Azure AD, por ejemplo).
En el flujo regular, una vez que la aplicación necesita autenticar al usuario, lo redirige a la pantalla de inicio de sesión de IdentityServer3, está bien. Pero en algunos casos, por solicitud, deseo omitir la pantalla de inicio de sesión de alguna manera informando a IdentityServer3 que el usuario desea iniciar sesión con un proveedor de identidad externo específico de inmediato.
¿Es eso posible hacer?
Cuando configura identtyserver con un proveedor externo, en AuthenticationOptions normalmente establece AutheticationType
en alguna cadena. Como abajo
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
{
AuthenticationType = "Google",
Caption = "Sign-in with Google",
SignInAsAuthenticationType = signInAsType,
ClientId = ConfigurationManager.AppSettings["google:clientid"],
ClientSecret = ConfigurationManager.AppSettings["google:clientsecret"],
});
Luego, en la aplicación cliente, puede establecer los acrvalues
de acrvalues
en acrvalues
de autenticación, como se muestra a continuación
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = (n) =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.AuthenticationRequest)
{
if(n.Request.Uri == "someurl")
{
//set acrvalues. the value of the `idp`, (which is `Google` in this case) must match with the `AutheticationType` you set in IdentityServer
n.ProtocolMessage.AcrValues = "idp:Google";
}
}
return Task.FromResult(0);
}
}
También tenga en cuenta que el valor idp
mayúsculas y minúsculas.
La otra opción (que NO he probado). En lugar de configurar idp
se configura el tenant
en la aplicación cliente.
n.ProtocolMessage.AcrValues = "tenant:" + n.Request.Uri.ToString();
Y como mencionó @TheRock, en IndentityServer verifique al arrendatario en SignInMessage
y anule Idp
public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
if(context.SignInMessage.Tenant = "sometenant")
{
context.SignInMessage.IdP = "Google";
return base.PreAuthenticateAsync(context);
}
}
De esta manera, a medida que agrega nuevos proveedores externos, no tiene que cambiar el código en la aplicación cliente. Solo debes actualizar el código de IndentityServer. Esto ayuda especialmente si tiene varias aplicaciones cliente conectándose al mismo servidor de identidad.
Sé que esto es antiguo, pero pensé que todavía lo pondría aquí para ayudar a alguien si desea redirigir automáticamente a un inicio de sesión externo:
public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
context.SignInMessage.IdP = "windows";
return base.PreAuthenticateAsync(context);
}
Básicamente, puede anular PreAuthenticateAsync en UserServiceBase y cambiar la propiedad IdP en el contexto.SignInMessage para que sea el nombre de los proveedores externos que se ha configurado en su inicio. Y esto va a redirigir.