17

Vor etwa einem Monat hatte ich ein Projekt perfekt mit ASP Identity OAuth. Ich würde eine POST-Anfrage an den/Token-Endpunkt mit grant_type, Benutzername und Passwort senden, und alles war gut.Immer 'invalid_client' Fehler beim POSTing an/Token-Endpunkt mit ASP Identity 2

Ich habe vor kurzem ein neues Projekt gestartet, das auf der SPA-Vorlage von Visual Studio 2013 RC2 basiert. Es ist ein bisschen anders als die alte Vorlage. Die Authentifizierung ist auf sehr einfache Standardwerte eingestellt,

OAuthOptions = new OAuthAuthorizationServerOptions 
{ 
    TokenEndpointPath = new PathString("/Token"), 
    //AuthorizeEndpointPath = new PathString("/Account/Authorize"), 
    Provider = new ApplicationOAuthProvider(PublicClientId), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
    AllowInsecureHttp = true 
}; 

Nichts wesentlich von der Standardvorlage geändert. Ich kann Konten erfolgreich über eine von mir implementierte Web-API-Controller-Methode registrieren.

// 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); 
    } 

Doch egal, was ich zu dem/Token-Endpunkt Post, ich immer die gleiche Antwort bekommen.

{"error":"invalid_client"} 

Normalerweise gebe ich folgende Anfrage Körper

grant_type=password&username=user%40domain.com&password=userpassword 

Aber dies führt zu den gleichen Fehler. Dies funktionierte im vorherigen VS2013 SPA Template/Identity. Was hat sich geändert?

Vielen Dank!

Antwort

2

Es stellt sich also heraus, dass die neuen Templates keine funktionale Implementierung von ApplicationOAuthProvider enthalten, die in den älteren Templates vorhanden war.

Nachdem ich this build talk angesehen habe, habe ich weiter untersucht und festgestellt, dass eine funktionierende Implementierung von ApplicationOAuthProvider verfügbar ist, um in this NuGet package auschecken zu können! Es ist der alten Implementierung sehr ähnlich.

0

Darüber hinaus können Sie die ApplicationOAuthProvider-Klasse verwenden, die mit der WebApi-Vorlage geliefert wird, wenn einzelne Benutzerkonten als Sicherheitsoption ausgewählt ist. Allerdings müssen Sie ein paar andere Dinge ändern, die ich unten aufgeführt habe. Ich hoffe, es hilft.

Die ApplicationOAuthProvider-Klasse, die mit dem WebAPI/Individual User kommt Konten Vorlage die folgende Methode enthält:

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); 
    } 

Kopieren Sie diese an die ApplicationOAuthProvider Klasse in Ihrem SPA-Vorlage Projekt, die ursprüngliche Methode überschrieben werden. Die Methode user.GenerateUserIdentityAsync ist ungültig, wenn sie in das SPA-Vorlagenprojekt kopiert wird, da die ApplicationUser-Klasse den Authentifizierungstyp "bearer" nicht zulässt.

eine Überlastung ähnlich den folgend auf die ApplicationUser Klasse (in der Models\IdentityModels.cs-Datei):

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager , string authenticationType) 
    { 
     var userIdentity = await manager.CreateIdentityAsync(this , authenticationType); 
     // Add custom user claims here 
     return userIdentity; 
    } 

Sie sollten nun in der Lage sein, /Token Endpunkt richtig zu verwenden.