source open identityserver example openid thinktecture-ident-server openid-connect thinktecture identityserver3

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.