Comment les jetons de stockage sont-ils stockés côté serveur dans Web API 2?

Je configure l’authentification par jeton au porteur dans Web API 2 et je ne comprends pas comment (ou où) le jeton support est stocké côté serveur. Voici le code correspondant:

Commencez:

public partial class Startup { public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } public static Func<UserManager> UserManagerFactory { get; set; } public static ssortingng PublicClientId { get; private set; } static Startup() { PublicClientId = "self"; UserManagerFactory = () => new UserManager(new UserStore()); OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathSsortingng("/Token"), Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), AuthorizeEndpointPath = new PathSsortingng("/api/Account/ExternalLogin"), AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), AllowInsecureHttp = true }; } public void ConfigureAuth(IAppBuilder app) { // Enable the application to use a cookie to store information for the signed in user app.UseCookieAuthentication(new CookieAuthenticationOptions()); // Use a cookie to temporarily store information about a user logging in with a third party login provider app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); app.UseOAuthBearerTokens(OAuthOptions); } } 

WebApiConfig:

 public class WebApiConfig { public static void ConfigureWebApi() { Register(GlobalConfiguration.Configuration); } public static void Register(HttpConfiguration http) { AuthUtil.ConfigureWebApiToUseOnlyBearerTokenAuthentication(http); http.Routes.MapHttpRoute("ActionApi", "api/{controller}/{action}", new {action = Actions.Default}); } } 

AuthUtil:

 public class AuthUtil { public static ssortingng Token(ssortingng email) { var identity = new ClaimsIdentity(Startup.OAuthOptions.AuthenticationType); identity.AddClaim(new Claim(ClaimTypes.Name, email)); var ticket = new AuthenticationTicket(identity, new AuthenticationProperties()); var currentUtc = new SystemClock().UtcNow; ticket.Properties.IssuedUtc = currentUtc; ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30)); var token = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket); return token; } public static void ConfigureWebApiToUseOnlyBearerTokenAuthentication(HttpConfiguration http) { http.SuppressDefaultHostAuthentication(); http.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); } } 

LoginController:

 public class LoginController : ApiController { ... public HttpResponseMessage Post([FromBody] LoginJson loginJson) { HttpResponseMessage loginResponse; if (/* is valid login */) { var accessToken = AuthUtil.Token(loginJson.email); loginResponse = /* HTTP response including accessToken */; } else { loginResponse = /* HTTP response with error */; } return loginResponse; } } 

En utilisant le code ci-dessus, je peux me connecter et stocker le jeton côté client dans un cookie, puis passer des appels aux contrôleurs marqués avec [Authorize] et cela me permet d’entrer.

Mes questions sont:

  1. Où / comment le jeton de support est-il stocké côté serveur? Il semble que cela se produise à travers l’un des appels OWIN, mais je ne peux pas dire où.

  2. Est-il possible de conserver les jetons de support sur une firebase database côté serveur afin qu’ils puissent restr en place après le redémarrage d’un serveur Web API?

  3. Si la réponse à la question n ° 2 est non, existe-t-il un client qui conserve son jeton porteur et le réutilise même après la fermeture de l’API Web? Bien que cela puisse être rare en production, cela peut arriver assez souvent lors de tests locaux.

  1. Ils ne sont pas stockés côté serveur – ils sont envoyés au client et le client les présente à chaque appel. Ils sont vérifiés car ils sont signés par la clé de protection de l’hôte. Dans l’hébergement SystemWeb, cette clé de protection est le paramètre machineKey de web.config.

  2. Cela n’est pas nécessaire, tant que la clé de protection utilisée par l’hôte owin ne change pas entre les redémarrages du serveur.

  3. Un client peut conserver un jeton tant que le jeton est valide.

Pour ceux qui cherchent comment définir web.config, voici un exemple

    

Il vous faut à la fois validationKey et decriptionkey pour que cela fonctionne.

Et voici comment générer des clés https://msdn.microsoft.com/en-us/library/ms998288.aspx

Pour append à cela, le jeton peut être conservé côté serveur à l’aide de la propriété SessionStore de CookieAuthenticationOptions. Je ne préconiserais pas de le faire, mais c’est là si vos jetons deviennent trop gros.

Ceci est un IAuthenticationSessionStore afin que vous puissiez implémenter votre propre support de stockage.