6

Stiamo costruendo una piattaforma in cui il client è ASP .Net MVC, utilizzando ASP Net Identity 2.0 per l'autenticazione e l'autorizzazione (tramite Claims), che funziona perfettamente sul lato web.Integrazione ASP.Net MVC e identità WCF (Claims)

Abbiamo anche un servizio WCF che consente le operazioni CRUD sul database (per più applicazioni client), che riceve richieste da questo client ASP .Net MVC. Siccome vogliamo validare (autenticare & autorizza) l'utente prima di fare azioni CRUD specifiche nel lato WCF, dobbiamo ottenere le richieste dell'utente dal client ed eseguire le convalide (preferibilmente in modo molto pulito usando intestazioni o qualsiasi legame che WCF sarà in grado di supportare per questa materia).

Ho cercato i diversi forum ma senza una semplice risposta \ tutorial per questo specifico scenario. Qualcuno può aiutare su questo argomento?

Grazie, Nir.

+0

Nir, il problema sembra passare le attestazioni al servizio WCF. Puoi passare le rivendicazioni effettive ricevute da Identity oppure passare un array o DTO i valori che rappresentano le autorizzazioni e gli ID che desideri trasmettere al tuo servizio ... –

+0

@nirpi, che cosa vuoi che il tuo servizio consumi : credenziali o token di sicurezza? –

+0

@DaveAlperovich, mi piacerebbe ottenere le attestazioni dall'intestazione, se possibile, quindi non avrei bisogno di "sporcare" tutti i miei metodi pubblici con parametri aggiuntivi per l'autenticazione. – nirpi

risposta

1

Amo questo:

nell'implementazione IEndpointBehavior farlo sul lato client:

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     request.Headers.Add(MessageHeader.CreateHeader("token", "http://myurl.com/service/token", _theToken)); 
     return null; 
    } 

poi alla fine del servizio aggiungere questo alla tua ServiceAuthenticationManager

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
     ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message) 
    { 
     IPrincipal user = new MyUserPrincipal(null); 

     if(_currentServiceContractType.GetInterfaces() 
             .Any(x => x == typeof(IMySecuredService))) 
     { 
      var tokenPosition = message.Headers.FindHeader("token", "http://myurl.com/service/token"); 

      if (tokenPosition >= 0 && tokenPosition <= 5) 
      { 
       var encryptedToken = message.Headers.GetHeader<string>(tokenPosition); 

       if (!string.IsNullOrWhiteSpace(encryptedToken)) 
       { 
        var serializedToken = new MyEncryptionUtility().Decrypt(encryptedToken); 
        var token = MyTokenSerializer.Deserialize(serializedToken); 
        var expire = new DateTime(token.ValidToTicks); 
        if (expire > DateTime.Now) 
        { 
         user = new MyUserPrincipal(token); 
        } 
       } 
      } 
     } 
     message.Properties["Principal"] = user; 
     Thread.CurrentPrincipal = user; 
     return authPolicy; 
    } 

questo ti dà quindi la possibilità di utilizzare le attestazioni predefinite o l'autenticazione delle attestazioni WIF. Ad ogni modo, questo è molto semplice. Il token viene creato dal servizio e inviato al client (web) e memorizzato nel cookie. poi quando ci sono richieste, il token viene prelevato da un cookie e poi inviato al servizio, dove, inevitabilmente, è possibile iniziare ad aggiungere le autorizzazioni lato servizio, rispetto a farlo sul lato web/mvc, creando una base di codice molto più pulita usando amico preferito di tutti, SOA> = :)

Problemi correlati