Comment sont porteur de jetons stockées côté serveur Web API 2?
Je suis en train d'ouvrir porteur du jeton d'authentification Web API 2, et je ne comprends pas comment (ou si) le porteur du jeton est stocké côté serveur. Voici le code correspondant:
De démarrage:
public partial class Startup
{
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
public static Func<UserManager<IdentityUser>> UserManagerFactory { get; set; }
public static string PublicClientId { get; private set; }
static Startup()
{
PublicClientId = "self";
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/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 string Token(string 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;
}
}
L'aide du code ci-dessus, je suis en mesure de vous connecter et de stocker le porteur du jeton côté client dans un cookie, et puis faire des appels à des contrôleurs marqué avec [Autoriser] et cela me permet de.
Mes questions sont:
-
Où /comment est le porteur du jeton être stockées côté serveur? Il semble que cela est hapenning à travers l'un des OWIN des appels mais je ne peux pas dire où.
-
Est-il possible de conserver le porteur de jetons à une base de données côté serveur, de sorte qu'ils peuvent rester en place après une API Web de redémarrer le serveur?
-
Si la réponse à la n ° 2 est non, est-il de toute façon pour un client de maintenir son porteur de symbolique et de la ré-utiliser, même après que le site Web de l'API descend et remonte en haut? Bien que cela soit rare dans la Production, il peut arriver assez souvent de faire des tests.
Vous devez vous connecter pour publier un commentaire.
Ils ne sont pas stockées côté serveur, ils sont remis au client et le client présente sur chaque appel. Ils sont vérifiés parce qu'ils sont signés par le owin de l'hôte de la clé de protection. Dans SystemWeb d'hébergement, que la clé de protection est la machineKey réglage à partir du web.config.
C'est inutile, aussi longtemps que la clé de protection de la owin hôte utilise ne change pas à travers le serveur redémarre.
Un client peut tenir sur un jeton pour aussi longtemps que le jeton est valide.
Logout
bouton pour le client, avec l'intention de supprimer/invalider le jeton d'authentification. Nous avons un peu de difficulté sur ce point. Merci.Pour ceux qui sont à la recherche pour savoir comment définir le web.config, voici un exemple de
Vous avez besoin de validationKey et decriptionkey pour le faire fonctionner.
Et ici est de savoir comment générer des clés
https://msdn.microsoft.com/en-us/library/ms998288.aspx
Pour ajouter à cela, le jeton peut être persisté côté serveur à l'aide de la SessionStore propriété de de CookieAuthenticationOptions. Je ne défends pas le faire, mais c'est là, si vos jetons sont trop volumineux.
C'est un IAuthenticationSessionStore de sorte que vous pourriez mettre en place votre propre support de stockage.
Par défaut, le jeton n'est pas stocké par le serveur. Seul votre client a et est de l'envoyer par le biais de l'en-tête d'autorisation au serveur.
Si vous avez utilisé le modèle par défaut fourni par Visual Studio, dans le Démarrage ConfigureAuth méthode la suite IAppBuilder extension est appelée: app.UseOAuthBearerTokens(OAuthOptions).