Cómo consume parámetros adicionales en la solicitud de token OAuth2 within.net Aplicación WebApi2


Tengo un proyecto específico de api en una gran solución web.net MVC 5. Estoy utilizando las plantillas WebApi2 listas para usar para autenticar a un usuario a través de la api. Usando cuentas individuales para autenticarse, el cuerpo de la solicitud requerido para obtener un token de acceso es:

grant_type=password&username={someuser}&password={somepassword}

Esto funciona como se esperaba.

Sin embargo, necesito agregar una 3a dimensión al método scaffolded "GrantResourceOwnerCredentials". Además de verificar el nombre de usuario/contraseña, necesito agregar un id de dispositivo, que es destinado a restringir el acceso desde una cuenta de usuario a un dispositivo específico. Lo que no está claro es cómo agregar estos parámetros de solicitud adicionales al ya definido "OAuthGrantResourceOwnerCredentialsContext". Este contexto actualmente hace espacio para el nombre de usuario y la contraseña, pero obviamente necesitaré incluir más.

Mi pregunta es simplemente, ¿hay una forma estándar de extender los requisitos de inicio de sesión para la solicitud de token OWIN OAuth2 para incluir más datos? Y, ¿cómo lo haría de forma fiable en un. NET ¿Entorno WebApi2?

Author: nak5ive, 2014-01-21

1 answers

Como suele ser el caso, encontré la respuesta inmediatamente después de enviar la pregunta...

ApplicationOAuthProvider.cs contiene el siguiente código listo para usar

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    using (UserManager<IdentityUser> userManager = _userManagerFactory())
    {
        IdentityUser 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 userManager.CreateIdentityAsync(user,
            context.Options.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
            CookieAuthenticationDefaults.AuthenticationType);
        AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }
}

Simplemente añadiendo

var data = await context.Request.ReadFormAsync();

Dentro del método, puede acceder a todas las variables publicadas en el cuerpo de la solicitud y usarlas como desee. En mi caso, lo coloqué inmediatamente después de la comprobación de null en el usuario para realizar una comprobación de seguridad más restrictiva.

Espero que esto ayude a alguien!

 91
Author: nak5ive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 21:55:08