web-dev-qa-db-fra.com

owin oauth envoyer des paramètres supplémentaires

Je suis sûr que c'est possible, mais je ne sais pas comment y parvenir. J'ai une implémentation OWIN OAUTH qui accepte actuellement le nom d'utilisateur et le mot de passe des utilisateurs et les authentifie par rapport à une base de données. Carte à puce.

Puis-je transmettre des paramètres supplémentaires dans la connexion OWIN et si oui, comment? La prémisse de base est qu'un utilisateur peut se connecter avec une combinaison nom d'utilisateur/mot de passe Ou un identifiant de carte à puce (si vous transmettez un identifiant de carte à puce et qui se trouve dans la base de données, l'application connectera l'utilisateur)

Je passe actuellement entre username, password et grant_type et je voudrais ajouter uid à cette liste et le récupérer dans mon AuthorizationServiceProvider.

Je peux voir UserName, Password et ClientId sur le OAuthGrantResourceOwnerCredentialsContext mais je ne vois aucune autre propriété qui prendrait en charge ce que j'essaie de réaliser.

Voici ce que j'ai actuellement chez mon fournisseur de services

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        var user = await this._userService.FindUser(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim(ClaimTypes.Sid, user.Id.ToString()));
        identity.AddClaim(new Claim(ClaimTypes.Role, "user"));
        identity.AddClaim(new Claim("sub", context.UserName));

        var secretKeyBytes = Encoding.UTF8.GetBytes(user.PasswordHash);
        var props =
            new AuthenticationProperties(
                new Dictionary<string, string>
                    {
                        { "dm:appid", user.Id.ToString() },
                        { "dm:apikey", Convert.ToBase64String(secretKeyBytes) }
                    });

        var ticket = new AuthenticationTicket(identity, props);
        context.Validated(ticket);
    }

Je veux également pouvoir obtenir Uid du contexte mais je ne vois pas comment y parvenir, toute aide est grandement appréciée.

22
Neil Stevens

Vous devez implémenter ValidateClientAuthentication si vous ne l'avez pas encore fait.

C'est l'endroit où vous devez valider votre client. Dans ces méthodes, vous allez faire une sorte de validation de votre client et définir les objets/variables qui peuvent être lus dans GrantResourceOwnerCredentials.

Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

reçoit un OAuthValidateClientAuthenticationContext qui contient le (s) champ (s) supplémentaire (s) que vous passez lors du POST sur votre serveur d'autorisation.

enter image description here

Dans l'image ci-dessus, j'ai ajouté un paramètre supplémentaire uid en 4ème position.

Avant de valider votre contexte:

context.Validated(clientId);

vous pouvez définir votre variable/objet:

string uid = context.Parameters.Where(f => f.Key == "uid").Select(f => f.Value).SingleOrDefault()[0];
context.OwinContext.Set<string>("SmartCard", uid);

Maintenant, dans votre GrantResourceOwnerCredentials, vous pouvez simplement lire la valeur et l'utiliser:

string uid = context.OwinContext.Get<string>("SmartCard");

Si vous voulez en savoir plus, vous pouvez jeter un œil à ce github repository où je passe un objet:

context.OwinContext.Set<ApplicationClient>("oauth:client", client);

Si vous téléchargez la solution complète, vous pouvez la tester avec un client javascript/jquery.

[~ # ~] mise à jour [~ # ~] :

Vous passeriez un paramètre supplémentaire (IE: uid ) dans votre requête http POST:

Vanilla Js :

var request = new XMLHttpRequest();
request.open('POST', oAuth.AuthorizationServer, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('Authorization', 'Basic ' + authorizationBasic);
request.setRequestHeader('Accept', 'application/json');
request.send("username=John&password=Smith&grant_type=password&uid=b17ac911-4cf1-4a3e-84a9-beac7b9da157");

jQuery :

$.ajax({
        type: 'POST',
        url: oAuth.AuthorizationServer,
        data: { username: 'John', password: 'Smith', grant_type: 'password', uid: 'b17ac911-4cf1-4a3e-84a9-beac7b9da157' },
        dataType: "json",
        contentType: 'application/x-www-form-urlencoded; charset=utf-8',
        xhrFields: {
        withCredentials: true
    },
        // crossDomain: true,
        headers: {
                'Authorization': 'Basic ' + authorizationBasic
    }
});
46
LeftyX