c# - net - Siempre recibe el error ''invalid_client'' al enviar POST/token endpoint con ASP Identity 2
web api c# ejemplo (3)
Además, puede usar la clase ApplicationOAuthProvider que viene con la plantilla de WebApi cuando se elige Cuentas de usuario individuales como la opción de Seguridad. Sin embargo, tendrás que cambiar un par de otras cosas, que he enumerado a continuación. Espero que ayude.
La clase ApplicationOAuthProvider que viene con la plantilla de Cuentas de usuario individuales / WebApi contiene el siguiente método:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
OAuthDefaults.AuthenticationType);
ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
CookieAuthenticationDefaults.AuthenticationType);
AuthenticationProperties properties = CreateProperties(user.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
Copie esto a la clase ApplicationOAuthProvider en su proyecto de plantilla SPA, sobrescribiendo el método original. El código user.GenerateUserIdentityAsync
método no es válido cuando se copia al proyecto de la plantilla SPA porque la clase ApplicationUser no permite el tipo de autenticación "portador".
Agregue una sobrecarga similar a la siguiente a la clase ApplicationUser (búsquelo en el archivo Models/IdentityModels.cs
):
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager , string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this , authenticationType);
// Add custom user claims here
return userIdentity;
}
Ahora debería poder usar /Token
endpoint correctamente.
Hace aproximadamente un mes tuve un proyecto que funcionaba perfectamente con ASP Identity OAuth. Enviaría una solicitud POST al punto final / Token con grant_type, nombre de usuario y contraseña, y todo fue excelente.
Hace poco comencé un nuevo proyecto basado en la plantilla SPA de Visual Studio 2013 RC2. Es un poco diferente a la plantilla anterior. La autenticación está configurada a valores por defecto bastante básicos,
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
//AuthorizeEndpointPath = new PathString("/Account/Authorize"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
Nada significativo cambió de la plantilla por defecto. Puedo registrar cuentas exitosamente a través de un método de controlador de API web que he implementado;
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (ModelState.IsValid)
{
var user = new TunrUser() { UserName = model.Email, Email = model.Email, DisplayName = model.DisplayName };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
return Created(new Uri("/api/Users/" + user.Id,UriKind.Relative), user.toViewModel());
}
else
{
return BadRequest(result.Errors.First());
}
}
return BadRequest(ModelState);
}
Sin embargo, no importa lo que publique en el punto final / Token, siempre obtengo la misma respuesta.
{"error":"invalid_client"}
Normalmente paso el siguiente cuerpo de solicitud
grant_type=password&username=user%40domain.com&password=userpassword
Pero esto resulta en el mismo error. Esto funcionó en la plantilla / identidad VS2013 SPA anterior. ¿Qué ha cambiado?
¡Gracias!
Así que resulta que las nuevas plantillas no incluyen una implementación funcional de ApplicationOAuthProvider que estaba presente en las plantillas anteriores.
Después de ver esta charla de compilación , investigué más y encontré que una implementación de trabajo de ApplicationOAuthProvider está disponible para revisar en este paquete de NuGet . Es muy similar a la implementación anterior.
Debe anular ValidateClientAuthentication & GrantResourceOwnerCredentials en el OAuthAuthorizationServerProvider.
Vea el ejemplo aquí: http://www.tugberkugurlu.com/archive/simple-oauth-server-implementing-a-simple-oauth-server-with-katana-oauth-authorization-server-components-part-1