it-swarm.com.de

Beim "POST" an/Token-Endpunkt mit wird immer ein 'invalid_client'-Fehler empfangen ASP Identität 2

Vor etwa einem Monat hatte ich ein Projekt, das perfekt mit ASP Identity OAuth zusammenarbeitete. Ich würde eine POST -Anforderung mit grant_type, Benutzername und Kennwort an den/Token-Endpunkt senden, und alles war gut.

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 ziemlich einfache Grundeinstellungen eingestellt.

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

Es hat sich nichts Wesentliches 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);
    }

Egal was ich POST zum/Token-Endpunkt, I always bekomme dieselbe Antwort.

{"error":"invalid_client"}

Normalerweise passiere ich den folgenden Anfragekörper

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

Dies führt jedoch zum gleichen Fehler. Dies funktionierte in der vorherigen SPA-Vorlage VS2013/Identity. Was hat sich geändert?

Vielen Dank!

19
Hayden McAfee

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

Nachdem ich dieses Build-Talk gesehen hatte, untersuchte ich weiter und stellte fest, dass eine funktionierende Implementierung von ApplicationOAuthProvider in diesem NuGet-Paket verfügbar ist. Es ist der alten Implementierung sehr ähnlich.

3
Hayden McAfee

Sie müssen die ValidateClientAuthentication & GrantResourceOwnerCredentials im OAuthAuthorizationServerProvider überschreiben.

Siehe Beispiel hier: http://www.tugberkugurlu.com/archive/simple-oauth-server-implementing-simple-oauth-server-mit-katana-oauth-authorization-server-component -Teil 1

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

Die ApplicationOAuthProvider-Klasse, die mit der Vorlage WebApi/Individuelle Benutzerkonten geliefert wird, enthält die folgende Methode:

    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 dies in die ApplicationOAuthProvider-Klasse in Ihrem SPA-Vorlagenprojekt und überschreiben Sie die ursprüngliche Methode. Die Code user.GenerateUserIdentityAsync-Methode ist ungültig, wenn sie in das SPA-Vorlagenprojekt kopiert wird, da die ApplicationUser-Klasse den Authentifizierungstyp "Träger" nicht zulässt.

Fügen Sie der ApplicationUser-Klasse eine Überladung ähnlich der folgenden hinzu (finden Sie sie in der Datei 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;
    }

Sie sollten jetzt /Token-Endpunkt korrekt verwenden können.

1
Michael Daw