net generation example asp c# asp.net-core asp.net-web-api2 access-token restsharp

c# - generation - asp.net core token authentication



RestSharp con autenticación JWT no funciona (2)

Entonces estás usando 2 middleware para identidad. Uno proporcionado por asp.net identity (basado en cookies) y otro basado en token. Ahora, ambos middleware usan el mismo atributo para manejar la solicitud [Authorize]. Más precisamente mira el código aquí

https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerHandler.cs

para JWTBearer

y

https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationHandler.cs

para Cookie

Debido a que ambos se activan en la tubería de middleware, el principal tendrá los datos cuando envíe el token de autenticación o la cookie.

Pero debido a que ambos están activos, cualquiera de ellos devolverá No autorizado para la solicitud que no tenga cookie o JwtBearer.

Para la solución que está buscando, debe crear un middleware sobre la cookie y token existentes para enrutar la solicitud en función de si el encabezado de autorización está presente.

Esta es la página donde "aprendí" cómo hacerlo: https://stormpath.com/blog/token-authentication-asp-net-core

Pero para mí esto no funciona (no funciona con Fiddler, también). Hay este controlador para mi ApplicationUser-model:

[Authorize] //works when it''s not set, doesn''t work when it''s set [Route("api/[controller]")] public class ApplicationUserController : Controller { private IRepository<ApplicationUser> _applicationUserRepository; public ApplicationUserController(IRepository<ApplicationUser> applicationUserRepository) { _applicationUserRepository = applicationUserRepository; } [HttpGet("{id}")] public ApplicationUser Get(int id) { return _applicationUserRepository.Get(id); } }

y está mi envoltorio para que RestSharp obtenga todos los usuarios de la aplicación:

public Task<T> GetResponseContentAsync<T>(string resource, int id) where T : new() { RestRequest request = new RestRequest($"{resource}/{{id}}", Method.GET); request.AddUrlSegment("id", id); if (!AuthenticationToken.IsNullOrEmpty(true)) { request.AddHeader("Authorization", string.Format("Bearer {0}", AuthenticationToken)); _client.Authenticator = new JwtAuthenticator(AuthenticationToken); _client.Authenticator.Authenticate(_client, request); } TaskCompletionSource<T> tcs = new TaskCompletionSource<T>(); _client.ExecuteAsync<T>(request, response => { tcs.SetResult(response.Data); }); return tcs.Task; }

Desde mi aplicación web-cliente quiero iniciar sesión con JWT (Token-Authentication) lo que funciona. Después de la conexión consigo este ejemplo señal_acceso: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJURVNUIiwianRpIjoiZTBjYjE0NjgtYzBmOS00ZTM4LTg4ZjgtMGM4ZjNmYjMyNjZmIiwiaWF0IjoxNDcwOTUwMTA0LCJuYmYiOjE0NzA5NTAxMDQsImV4cCI6MTQ3MDk1MDQwNCwiaXNzIjoiRXhhbXBsZUlzc3VlciIsImF1ZCI6IkV4YW1wbGVBdWRpZW5jZSJ9.a9_JK2SG3vzc6NSOB0mZXqHlM9UAEXUHHrrijAQUsX0

sin el atributo Authorize obtengo el usuario de la aplicación, pero al configurar el atributo, el resultado es nulo (dado que no se llama a la API web).

la llamada envoltura se ve así:

//this works, token-value is set string token = new RepositoryCall("http://localhost:54008/").Login("token", "TEST", "TEST123"); string accessToken = JsonConvert.DeserializeObject<Dictionary<string, string>>(token)["access_token"]; ViewData["Result"] = accessToken; ApplicationUser userAfterLogin = await new RepositoryCall("http://localhost:54008/api") { AuthenticationToken = accessToken } .GetResponseContentAsync<ApplicationUser>("ApplicationUser", 2);

y aquí userAfterLogin es nulo.

Estoy tratando de obtener el inicio de sesión desde hace dos semanas, pero todavía no lo entiendo bien ..

¿Alguna idea de lo que estoy haciendo mal? Tal vez un valor de encabezado de solicitud incorrecta para la autorización?

Actualizar

este es mi Startup.Configure donde configuré para usar el Bearer / JWT:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseIdentity(); var secretKey = "mysupersecret_secretkey!123"; var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)); // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715 var options = new TokenProviderOptions { Audience = "ExampleAudience", Issuer = "ExampleIssuer", SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256), }; var tokenValidationParameters = new TokenValidationParameters { // The signing key must match! ValidateIssuerSigningKey = true, IssuerSigningKey = signingKey, // Validate the JWT Issuer (iss) claim ValidateIssuer = true, ValidIssuer = "ExampleIssuer", // Validate the JWT Audience (aud) claim ValidateAudience = true, ValidAudience = "ExampleAudience", // Validate the token expiry ValidateLifetime = true, // If you want to allow a certain amount of clock drift, set that here: ClockSkew = TimeSpan.Zero }; app.UseJwtBearerAuthentication(new JwtBearerOptions { AutomaticAuthenticate = true, AutomaticChallenge = true, TokenValidationParameters = tokenValidationParameters }); app.UseCookieAuthentication(new CookieAuthenticationOptions { AutomaticAuthenticate = true, AutomaticChallenge = true, AuthenticationScheme = "Cookie", CookieName = "access_token", TicketDataFormat = new CustomJwtDataFormat( SecurityAlgorithms.HmacSha256, tokenValidationParameters) }); app.UseMiddleware<TokenProviderMiddleware>(Options.Create(options)); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }


En Fiddler vería, si se le redirige a la página de inicio de sesión (reportaría 2 resultados, uno con 302 (redirigir) y luego el 404 - ¿ese es el caso?

Tiene DebugLogger activado, entonces intente AddDebug (LogLevel.Trace) y vea la ventana de salida de depuración, es muy útil para analizar cuál de los pasos de autenticación falla. También muestra si la autenticación falla o la autorización, y si tiene un token válido, etc. Por lo tanto, apunta a la dirección para buscar problemas.