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.
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.