Saltar al contenido

Tutorial de la API web de ASP.NET: Implementación de un simple servidor OAuth

A continuación, tenemos que configurar el punto final del token OAuth 2.0 para apoyar el tipo de concesión de credenciales de la contraseña del propietario de recursos utilizando el OAuthAuthorizationServerMiddleware que viene con la biblioteca Microsoft.Owin.Security.OAuth. Esto requiere un servidor de autorización que luego será conectado al oleoducto Katana.

La escritura de un servidor de autorización utilizando Katana gira en torno a una clase que deriva de OAuthAuthorizationServerProvider, que contiene métodos que permiten manipular el protocolo OAuth2.

Tutorial de la API web de ASP.NET: Implementación de un simple servidor OAuth
Tutorial de la API web de ASP.NET: Implementación de un simple servidor OAuth

Para ello, añadiré una clase llamada MyOAuthAuthorizationServerProvider que deriva de OAuthAuthorizationServerProvider y métodos de anulación ValidateClientAuthentication y GrantResourceOwnerCredentials.

12345678910111213141516171819202122232425262728293031clase públicaProveedor del Servidor de MiOAutorización:Proveedor del Servidor de OAutorización{publicoverrideSystem.Threading.Tasks.TaskValidateClientAuthentication(OAuthValidateClientAuthenticationContext){string cid, csecret;if(context. TryGetBasicCredentials(out cid,out csecret)){var svc = context.OwinContext.Environment.GetUserAccountService<UserAccount>();if(svc.Authenticate("clients", cid, csecret)){ context.Validated();}}devolver Tarea. DeResultado<object;}(nulo);}supervisión públicaTaskGrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext){var svc = context.OwinContext.Environment.GetUserAccountService<UserAccount;};UserAccount user;if(svc. Authenticate("users", context.UserName, context.Password,out user)){var claims = user.GetAllClaims();var id =newSystem.Security.Claims.ClaimsIdentity(claims, "MembershipReboot"); context.Validated(id);}returnbase.GrantResourceOwnerCredentials(context);}}

csharp

En el método ValidateClientAuthentication, tengo un código que valida las credenciales del cliente y llama al método OAuthValidateClientAuthenticationContext.Validated() si las credenciales coinciden con un registro de la base de datos. Si el cliente es validado, entonces pasa a validar las credenciales del usuario o propietario del recurso (nombre de usuario y contraseña), y llama al método Validated() en la instancia de OAuthGrantResourceOwnerCredentialsContext que será pasado al método GrantResourceOwnerCredentials.

Ahora tenemos que conectar el middleware del servidor de autorización al oleoducto Owin. Hay un método de extensión de taquigrafía en IAppBuilder para usar este middleware, que es UseOAuthAuthorizationServer. Usaremos este método de extensión para configurar los puntos finales de OAuth 2.0 en la clase Startup:

1234567891011publicvoidConfiguration(IAppBuilder app){ SimpleInjectorWebApiInitializer.Initialize(app); app.UseOAuthAuthorizationServer(newMicrosoft.Owin.Security.OAuth. OAuthAuthorizationServerOptions{ AllowInsecureHttp =true,//s should be disabled in production Provider =newMyOAuthAuthorizationServerProvider(), TokenEndpointPath =newPathString("/token")});}

csharp

Además, vamos a añadir el middleware de autenticación del token portador para consumir el token:

1234567891011121314151617181920publicvoidConfiguration(IAppBuilder app){ SimpleInjectorWebApiInititializer.Initialize(app); app.UseOAuthAuthorizationServer(newMicrosoft.Owin.Security.OAuth. OAuthAuthorizationServerOptions{ AllowInsecureHttp =true, Provider =newMyOAuthAuthorizationServerProvider(), TokenEndpointPath =newPathString("/token")});// token consumptionvar oauthConfig =newMicrosoft. Owin.Security.OAuth.OAuthBearerAuthenticationOptions{ AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, AuthenticationType ="Bearer"};// Habilitar la aplicación para usar tokens portadores para autentificar usuarios app.UseOAuthBearerAuthentication(oauthConfig);}

csharp

Para obtener una ficha, tenemos que hacer una solicitud por correo a localhost/token pasando los parámetros necesarios. Por ejemplo:

1234POST http://localhost:19923/tokenContent-Type: Application/x-www-form-urlencodedusername=jbloggs&password=pass1234&grant_type=password

En este punto, obtendremos un resultado como el siguiente:

123456{"access_token": "XoHocsL0wOJBVVrjvSj6GpdGD-VrPD2ainZGyeZ8ji0aTq33epyHw72POhB8evYn41fzaSnjx7eo0iclADQBWTMgnghgZdXzNoLo6hwf4Y3SiB0aPTPgZi6PJwoGQK_aMWW62770jo6PBznPrSO0AOZUIrpxjUSZze90- HJjsM9ZgATIWdIvuiICqVjW7n5Z-o0GNSoDTIm-4k2zee0- c_lifHuLmW97IbsQ3I4gMz1SCBReSJtXJc8noPHvgwhFB_qZ2R1-TxR64nUVgxYtBAoy9n6WKTgNAqrnUwsa0jfMk6wselrLwMGq-R- 6_AX4bkh16OZBTGa5hXVWoLPIHl2JTKCkO2DsX2jqvp3J7PObRkZWMyUOyzwhnQWu_XTpn4ogwtcJvLulfiA6W01s8qiUQO--Xefm38ngu5HTM4", "token_type": "portador", "expires_in":1199}

json

Y eso es todo lo que necesitamos para empezar a rodar. Como pueden ver, la ficha tiene un tipo y una fecha de caducidad. ¡Limpio y seguro! Tengo un proyecto de muestra aquí en GitHub.