2015-11-25 5 views
5

Sto tentando di implementare l'autorizzazione JWT in un progetto. Tuttavia, per ottenere correttamente il token devo passare client_id dal frontend di AngularJS al backend API Web di ASP.NET e per quanto ne so non è affatto sicuro. Quindi qualcuno potrebbe darmi un suggerimento su cosa dovrei fare nella mia situazione.Cosa fare con JWT client_id su backend JavaScript con API Web ASP.NET

Sul lato JS -

var data = 'grant_type=password&username=' 
        + loginData.Email + '&password=' + loginData.Password + '&client_id=' + client_id; 
$http.post('/oauth2/token', data); //Code omitted 

sto usando questo guide per la creazione di un'autorizzazione Jwt, per la maggior parte. Tranne Ho un app su un dominio, ecco quello che il mio Startup.cs assomiglia -

public void Configuration(IAppBuilder app) 
     { 
      var config = new HttpConfiguration();    
      config.MapHttpAttributeRoutes();  
      ConfigureOAuth(app);  
      ConfigureValidationOAuth(app); 
     } 

private static void ConfigureOAuth(IAppBuilder app) 
     { 
      var oAuthServerOptions = new OAuthAuthorizationServerOptions 
      { 
       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/oauth2/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30), 
       Provider = new CustomOAuthProvider(), 
       AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["owin:issuer"]) 
      }; 

      app.UseOAuthAuthorizationServer(oAuthServerOptions); 
     } 

private static void ConfigureValidationOAuth(IAppBuilder app) 
    { 
     var issuer = ConfigurationManager.AppSettings["owin:issuer"]; 
     var audience = ConfigurationManager.AppSettings["owin:audience"]; 
     var secret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["owin:secret"]); 

     //Api controllers with [Authorize] attribute will be validated with Jwt 
     app.UseJwtBearerAuthentication(
      new JwtBearerAuthenticationOptions 
      { 
       AuthenticationMode = AuthenticationMode.Active, 
       AllowedAudiences = new[] {audience}, 
       IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
       { 
        new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret) 
       } 
      }); 
    } 
+1

Penso che "client_id" si riferisce all'ID del ** client software ** che richiede il token e non la persona. Immagino che tu debba impostare un elenco di client software autorizzati all'autenticazione/autorizzazione con il tuo server. ** BTW ** Suggerirei di usare [ThinkTecture IdentityServer] (https://github.com/IdentityServer/IdentityServer3) per implementare il tuo server, non reinventare la ruota, specialmente quando si tratta di autenticazione/autorizzazione. –

+0

Grazie per la risposta. Quindi, posso semplicemente salvarlo solo dal lato server, giusto? E grazie per il link. – renchan

+1

Il client_id viene utilizzato principalmente per evitare che i client non autorizzati utilizzino il proprio server di autenticazione o inseriscano richieste specifiche per clienti specifici. Ad esempio, gli utenti che eseguono l'autenticazione da client1 potrebbero ottenere attestazioni diverse dagli utenti che si autenticano utilizzando client2 –

risposta

2

l'autenticazione e l'autorizzazione JWT dovrebbe funzionare in questo modo:

  1. passaggio username e passare al server
  2. server controlla i dati dell'utente e genera il token JWT che dovrebbe essere in questo formato: (check-out JWT.io per ulteriori informazioni)

    e yJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

  3. il token JWT deve essere conservato lato client in una memoria locale

  4. per rendere la vita più facile che si dovrebbe creare una richiesta HTTP intercettore angolare che aggiunge automaticamente il token JWT salvato al richiesta intestazioni. Qualcosa di simile a questo:

myApp.factory('jwt-interceptor', ['$q', '$window', function($q, $window) { return { request: function(request) { request.headers['Authorization'] = 'Bearer ' + $window.localStorage.token; return request; }, responseError: function(response) {
return $q.reject(response); } }; }]).config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push('jwt-interceptor'); }]);

  1. server dovrebbe leggere l'intestazione di nome param Authorization, decompilare il token e verificare se il carico utile:

    a. è stato decompilato correttamente e il carico utile è intatto

    b. controlla se il timestamp di scadenza nel payload è maggiore del timestamp attuale

    c. altri controlli relativi al permesso dell'utente (se necessario)

Problemi correlati