AddoAuth Obtenga Access_Token de la respuesta de tokenendpoint no estándar -- asp.net-core campo con .net-core campo con identityserver4 campo con asp.net-core-3.1 camp Relacionados El problema

AddOAuth get access_token from nonstandard TokenEndpoint response


0
vote

problema

Español

He añadido la autenticación como esta

      services.AddAuthentication()                 .AddOAuth("external", "External Login", options =>                 {                     options.ClientId = "external_id";                     options.ClientSecret = "external_secret";                     options.CallbackPath = new PathString("/signin-external");                      options.AuthorizationEndpoint = "https://external.com/open-apis/authen/v1/index?app_id=external_id&redirect_uri=" + WebUtility.UrlEncode("https://myapp.com/signin-external");                     options.TokenEndpoint = "https://external.com/open-apis/authen/v1/access_token";                     options.UserInformationEndpoint = "https://external.com/open-apis/authen/v1/user_info";                      options.BackchannelHttpHandler = new ExternalAuthorizingHandler(new HttpClientHandler(), options);                      options.Events = new OAuthEvents                     {                         // never called                         OnCreatingTicket = async context =>                         {                             var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);                             request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);                              request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                              var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);                             response.EnsureSuccessStatusCode();                              var user = JsonDocument.Parse(await response.Content.ReadAsStringAsync());                              //context.HttpContext.Response.Cookies.Append("token", context.AccessToken);                              context.RunClaimActions(user.RootElement);                         }                     };                 });   

ExternalAutorizingHandler.cs

  public class ExternalAuthorizingHandler : DelegatingHandler     {         private readonly OAuthOptions options;         public ExternalAuthorizingHandler(HttpMessageHandler inner, OAuthOptions options) : base(inner)         {             this.options = options;         }          protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)         {             if (request.RequestUri == new Uri(options.TokenEndpoint))             {                 string appendData = $"app_id={options.ClientId}&app_secret={options.ClientSecret}&";                 var content = request.Content.ReadAsStringAsync().Result;                 var cntn = QueryHelpers.ParseQuery(appendData + content);                  var dict = new Dictionary<string, string>();                 foreach (var c in cntn)                 {                         dict.Add(c.Key, c.Value[0]);                 }                 string newContent = JsonConvert.SerializeObject(dict);                  request.Content = new StringContent(newContent, System.Text.Encoding.UTF8, "application/json");             }             return base.SendAsync(request, cancellationToken);         }     }   

Este código puede ejecutarse hasta que obtenga un código de autorización y redirigir a TokenendPoint

Pero después de SendAsync se ejecuta, obtengo una error

No sé si SendAsync es el éxito o no, pero si es el éxito, la respuesta de Tokenendpoint será como:

  {     "code": 0,     "data": {         "access_token": "u-D8kcSIGdlwQCySfgiEbrNc",         "en_name": "John Doe",         "expires_in": 6900,         "name": "John Doe",         "open_id": "ou_bace1bf309f5c8ad196019e63725e7ce",         "refresh_expires_in": 2591700,         "refresh_token": "ur-jFRCmumR5nqhanRVH3SGdf",         "tenant_key": "2ede6044ee4f1656",         "token_type": "Bearer",         "union_id": "on_13c0df6770171400f042f536660ca8be"     },     "msg": "success" }   
  1. ¿Qué error es y cómo manejarlo? ¿Está relacionado con la cookie?
  2. Cómo verificar SendAsync Resultado
  3. Cómo manejar la respuesta como arriba de AddOAuth opciones

gracias

Original en ingles

I've added authentication like this

    services.AddAuthentication()                 .AddOAuth("external", "External Login", options =>                 {                     options.ClientId = "external_id";                     options.ClientSecret = "external_secret";                     options.CallbackPath = new PathString("/signin-external");                      options.AuthorizationEndpoint = "https://external.com/open-apis/authen/v1/index?app_id=external_id&redirect_uri=" + WebUtility.UrlEncode("https://myapp.com/signin-external");                     options.TokenEndpoint = "https://external.com/open-apis/authen/v1/access_token";                     options.UserInformationEndpoint = "https://external.com/open-apis/authen/v1/user_info";                      options.BackchannelHttpHandler = new ExternalAuthorizingHandler(new HttpClientHandler(), options);                      options.Events = new OAuthEvents                     {                         // never called                         OnCreatingTicket = async context =>                         {                             var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);                             request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);                              request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                              var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);                             response.EnsureSuccessStatusCode();                              var user = JsonDocument.Parse(await response.Content.ReadAsStringAsync());                              //context.HttpContext.Response.Cookies.Append("token", context.AccessToken);                              context.RunClaimActions(user.RootElement);                         }                     };                 }); 

ExternalAuthorizingHandler.cs

public class ExternalAuthorizingHandler : DelegatingHandler     {         private readonly OAuthOptions options;         public ExternalAuthorizingHandler(HttpMessageHandler inner, OAuthOptions options) : base(inner)         {             this.options = options;         }          protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)         {             if (request.RequestUri == new Uri(options.TokenEndpoint))             {                 string appendData = $"app_id={options.ClientId}&app_secret={options.ClientSecret}&";                 var content = request.Content.ReadAsStringAsync().Result;                 var cntn = QueryHelpers.ParseQuery(appendData + content);                  var dict = new Dictionary<string, string>();                 foreach (var c in cntn)                 {                         dict.Add(c.Key, c.Value[0]);                 }                 string newContent = JsonConvert.SerializeObject(dict);                  request.Content = new StringContent(newContent, System.Text.Encoding.UTF8, "application/json");             }             return base.SendAsync(request, cancellationToken);         }     } 

this code can run until I get authorization code and redirect to tokenEndpoint

but after SendAsync is executed I get an error

I don't know if SendAsync is success or not, but if it's success then the response from tokenEndpoint will be like:

{     "code": 0,     "data": {         "access_token": "u-D8kcSIGdlwQCySfgiEbrNc",         "en_name": "John Doe",         "expires_in": 6900,         "name": "John Doe",         "open_id": "ou_bace1bf309f5c8ad196019e63725e7ce",         "refresh_expires_in": 2591700,         "refresh_token": "ur-jFRCmumR5nqhanRVH3SGdf",         "tenant_key": "2ede6044ee4f1656",         "token_type": "Bearer",         "union_id": "on_13c0df6770171400f042f536660ca8be"     },     "msg": "success" } 
  1. what error is it and how to handle it? is it related with cookie?
  2. how to check SendAsync result
  3. how to handle response like above from AddOAuth options

thanks

           

Lista de respuestas

0
 
vote

En el núcleo ASP.NET, no debe usar AddoAuth, en su lugar, se recomienda más para usar AddopenidConnect.

con respecto a la ubicación desconocida, quizás esto Pregunta podría darte una pista.

 

In ASP.NET Core, you should not use AddOAuth, instead its more recommended to use AddOpenIDConnect.

Regarding the unknown location, perhaps this question might give you some clue.

 
 

Relacionados problema

1  Render Razor MVC en la consola no funciona después de la migración a Asp Core 3.1  ( Render razor mvc in console not work after migration to asp core 3 1 ) 
Estamos migrando de ASP Core 2.1 a ASP Core 3.1, todos están funcionando bien, pero una herramienta de línea de comandos estúpida utilizada para probar "Razor...

4  Cómo hacer enrutamiento personalizado en ASP.NET CORE 3.1 MVC  ( How to do custom routing in asp net core 3 1 mvc ) 
No puedo usar enrutamiento simple como en .NET CORE 2.2 en .NET CORE 3.1. ¿Cuál es el ÚLTIMO CAMBIO DE ENRUSTO EN EL NENE 3.1? ...

1  AppContext.Basedirectory vs montaje.getEntryAssembly (). ¿La ubicación será la misma después de publicar la aplicación?  ( Appcontext basedirectory vs assembly getentryassembly location will be same af ) 
Estoy desarrollando ASP.NET Core 3.1 Web API y tenga mi configuración xxx.xml1 . He añadido la documentación de Swagger a mi proyecto. Clic derecho API...

0  ¿Cómo puedo combinar los inicios de sesión externos y la autenticación de dos factores en la identidad del núcleo de ASP.NET?  ( How can i combine external logins and two factor authentication in asp net core ) 
Estoy implementando la autenticación y la autorización para una aplicación web simple construida con ASP.NET Core 3.1. Hasta ahora, la identidad del núcleo de...

1  ¿Cómo configuro JSON.NET como serializador predeterminado en ASP.NET Core 3.1  ( How do i set json net as default serializer in asp net core 3 1 ) 
Convertir una aplicación web de ASP.NET CORE 2.1 a 3.1 y descubrió algunos puntos finales rotos porque el nuevo JSON Serializer funciona de manera diferente a...

7  ¿Cómo puedo sembrar usuarios y roles en mi aplicación ASP.NET Core 3.1?  ( How can i seed users and roles in my asp net core 3 1 application ) 
Intenté usar protected override void OnModelCreating(ModelBuilder builder) en My IdentityDatacontext Class y creando una migración que sembrará estos datos:...

0  Pivotal .NETCORE 3.1 DotNet-Runtime Error durante la implementación  ( Pivotal netcore 3 1 dotnet runtime error during deployment ) 
Quiero desplegar mi proyecto usando Pivotal de Bamboo. Durante el despliegue de mi proyecto .netcore 3.1 , estoy recibiendo el error " No se puede instalar D...

0  Actualice la caducidad del token actual de JWT en el evento de clics MVC .NET Core 3.1  ( Update current jwt token expiration on click event mvc net core 3 1 ) 
¿Hay una manera de actualizar el tiempo de vencimiento actual de JWT Token en el evento? Tengo un modal que advierte al usuario que su token va a caducar y de...

0  Actualizar la corriente de JWT Token sin actualizar Token MVC .NET Core 3.1  ( Refresh current jwt token without refresh token mvc net core 3 1 ) 
Soy extremadamente nuevo para MVC y me preguntaba si hay una manera de restablecer el tiempo de vencimiento en un token de JWT actual sin los usos de un token...

0  ¿Cómo redirigir la URL pública de Apache al contenedor de Docker?  ( How to redirect apache public url to docker container ) 
Tengo un proyecto WEBAPI que se encuentra dentro de un contenedor de Docker. Un certificado autofirmado está disponible y está conectado a Apache. Al comunica...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos