Estoy configurando el portador de token de autenticación en la Web API 2, y no entiendo cómo (o donde) el portador token se almacena en el lado del servidor. Aquí está el código correspondiente:

De inicio:

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;
    }
}

Utilizando el código de arriba, yo soy capaz de acceder y almacenar el portador token del lado del cliente en una cookie y, a continuación, hacer llamadas a los controladores marcados con [Authorize] y me deja entrar.

Mis preguntas son:

  1. Dónde /cómo es el portador de token de ser almacenados en el lado del servidor? Parece que esto se está pasando a través de uno de los OWIN llamadas pero no puedo decir dónde.

  2. Es posible que persista el portador de tokens a una base de datos en el lado del servidor para que puedan permanecer en su lugar después de una API Web de reiniciar el servidor?

  3. Si la respuesta a #2 no es, es de todos modos para un cliente para mantener su portador token y re-uso, incluso después de las API Web se cae y vuelve a subir? Mientras que esto puede ser raro en la Producción, puede suceder muy a menudo haciendo pruebas locales.

InformationsquelleAutor dposada | 2014-01-13

4 Comentarios

  1. 87
    1. Que no está almacenado el lado del servidor, son emitidos para el cliente, y el cliente que se presenta en cada llamada. Son verificados porque está firmado por el owin de host de la llave de protección. En SystemWeb de hosting, que la clave de protección es el machineKey configuración de la web.config.

    2. Que es innecesario, siempre y cuando la llave de protección de la owin host usa no cambia en el servidor se reinicia.

    3. Que un cliente puede tener en un token de tan largo como el token es válido.

    • ¿Cómo funciona el portador de token de obras en el entorno de la granja donde las solicitudes pueden golpear en cualquier servidor dentro de la granja? ¿Cómo funciona el token de verificar?
    • Como ya he dicho, la protección es a través de la acogida de la protección de la que será la machineKey en IIS. Así que para hacer la web el trabajo de la granja que había necesidad de sincronizar el machineKey en la web.config.
    • He buscado por el machineKey en mi proyecto que es el uso de OWIN, pero no parece ser declarada en cualquier lugar. Hay un defecto de la clave de protección que OWIN utiliza si machineKey no se establece explícitamente, o solo estoy perdiendo en algún lugar?
    • A continuación, usted está consiguiendo el auto generado clave del equipo.
    • ¿cómo se puede actualizar o ampliar este token generado con cada llamada al servicio de cualquier cliente? Donde los tokens generados sigue siendo el mismo y sólo el tiempo de Expiración se extiende por el período de tiempo configurado?
    • Re respuesta 1: Solo me pregunto si es sólo una verificación ¿cómo validar la fecha de caducidad/tiempo? Y no es cada token diferentes?
    • con Web Api 2, estamos tratando de averiguar cómo QUITAR el token desde el cliente. En otras palabras, estamos simulando un Logout botón para el cliente con la intención de eliminar o invalidar el auth token. Estamos teniendo un poco de dificultad en esto. Gracias.
    • no hay manera de hacerlo para usuarios específicos cuando se utiliza el plan de OAuth2 portador token patrón. Lo que usted necesita hacer es implementar la Actualización de Token de patrón en la parte superior de la misma en la que su problema de muy corta duración portador de fichas a lo largo del lado de larga duración de actualización de fichas. Actualización de token SE almacena el lado del servidor (yo uso Redis para mi la actualización de token de cosas). Cliente en un intervalo justo antes de la caducidad de las solicitudes de un nuevo token llamando a la /Token extremo con el token de actualización y consigue un nuevo Acceso (portador) de la ficha. Entonces, cuando cierra la sesión, se invalida el token de actualización en el servidor y el token de acceso expirará pronto
    • ¿qué pasa si alguien husmea el token y lo utilizan para el propósito malicioso? si alguien tiene el token de diez se puede acceder a todos los datos! ¿cómo podemos proteger a esta cosa

  2. 3

    Para aquellos que están buscando la manera de establecer web.config, he aquí una muestra de

    <system.web>
    <machineKey validation="HMACSHA256" validationKey="64-hex"
                     decryption="AES" decryptionKey="another-64-hex"/>
    </system.web>
    

    Necesita tanto validationKey y decriptionkey para hacer que funcione.

    Y aquí es cómo generar claves
    https://msdn.microsoft.com/en-us/library/ms998288.aspx

  3. 2

    Para añadir a esto, el token puede ser persistente lado del servidor utilizando el SessionStore propiedad de CookieAuthenticationOptions. No me defensor haciendo esto, pero es lo que hay si tu token es excesivamente grande.

    Este es un IAuthenticationSessionStore de modo que se podría implementar su propio medio de almacenamiento.

  4. 0

    Por defecto, el símbolo no es almacenada por el servidor. Sólo que su cliente tiene y está enviando a través del encabezado de autorización para el servidor.

    Si utiliza la plantilla predeterminada de Visual Studio, en el Inicio de ConfigureAuth método de la siguiente IAppBuilder extensión se llama: app.UseOAuthBearerTokens(OAuthOptions).

Dejar respuesta

Please enter your comment!
Please enter your name here