none
WCF Rest, autenticazione semplice di client mobile

    Question

  • Ciao a tutti,
    vi espongo la mia situazione:
    devo sviluppare un webservice REST (host IIS) che esponga una serie di metodi, alcuni dei quali necessitano un'autenticazione.

    Vorrei fare in modo che i client (dispositivi mobile) possano accedere dopo aver inserito login e password da UI. Pensavo fosse facile utilizzare i meccanismi automatici di ASP.NET (membership e role), ma dopo innumerevoli prove non ci sono riuscito.
    Ho la necessità di utilizzare un'autenticazione semplice, non avendo la possibilità di utilizzare SSL e/o certificati. Volevo utilizzare un semplice cookie, e se possibile utilizzare quello che fa già asp.net authentication.

    Qualcuno può darmi una mano?

    Programamtore ASP.NET
    http://glucolo.wordpress.com

    Monday, April 22, 2013 2:38 PM

All replies

  • Ciao Glauco,

    You wrote on 22/04/2013 :

    Vorrei fare in modo che i client (dispositivi mobile) possano accedere dopo aver inserito login e password da UI. Pensavo fosse facile utilizzare i meccanismi automatici di ASP.NET (membership e role), ma dopo innumerevoli prove non ci sono riuscito.
    Ho la necessità di utilizzare un'autenticazione semplice, non avendo la possibilità di utilizzare SSL e/o certificati. Volevo utilizzare un semplice cookie, e se possibile utilizzare quello che fa già asp.net authentication.

    Qualcuno può darmi una mano?

    quale è il problema che incontri?
    Che cosa usi come tecnologia server side per costruire il servizio?
    Che cosa usi come tecnologia client side per costruire il client?

    a grandi linee, per semplificare molto i dialogo tra cliente e server:
    - devi avare una pagina su cui l'utente fa login;
    - la pagina ti risponderà con i cookie della FormsAuthentication;
    - l'applicazione mobile carica quella pagina in un controllo webbrowser ospitato internamente all'applicazione in modo da poter accedere ai cookie
    - se quando l'utente ha fatto login trovi i cookie semplicemente li salvi localmente, non ti interessa cosa c'è dentro;
    - ad ogni richiesta http, che farai al tuo servizio rest, altro non farai che appendere anche i cookie esattamente come farebbe il browser
    - il resto lo fatto tutto in automatico la forms authentication dall'altra parte;



    blog @ //milestone.topics.it
    Tuesday, April 23, 2013 4:57 AM
  • Ciao, grazie per l'interesse.

    Sul server ho un WCF 4 con host IIS. Quello che vorrei fare è utilizzare le membership per l'autenticazione, ma mi chiede obbligatoriamente o SSL, o certificato (e non posso metterli).
    Ho visto ci sarebbe anche un Authentification Serivce Application, che se non ho capito male è un WCF apposito per l'autenticazione, ma anche questo vuole "protezione".

    I client sono diversi (Web asp.net, iPhone, WindowsPhone, Android), per questo si è scelto di utilizzare WCF REST.

    La soluzione che mi hai suggerito tu potrebbe funzionare, ma non mi piace molto. E non credo che piaccia nemmeno al cliente finale. La richiesta infatti è di un login interno all'applicazione.

    Quello che mi hai detto per il client, va benissimo, ovvero che ad ogni richiesta che fa ci appende il cookie così com'è, senza preoccuparsi di cosa ci sia dentro. Benissimo!!!!
    Il problema infatti io l'ho sul server. Non riesco a far funzionare il WCF con l'autenticazione utilizzando la sqlMembershipProvider.

    Il codice che ho fatto è circa questo:

    <behavior name="MembershipBehavior">
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
                                membershipProviderName="SqlMembershipProvider"/>
      </serviceCredentials>
    </behavior>
    

    Quello che non riesco a fare è agganciare il WCF alla membership, nonostante il codice scritto sopra. Ho letto anche in giro di come utilizzare l'autenticazione Basic, ma stessa cosa, ho problema con la configurazione sul server.

    ciao grazie


    Programamtore ASP.NET
    http://glucolo.wordpress.com

    Tuesday, April 23, 2013 8:00 AM
  • Ciao Glauco,

    You wrote on 23/04/2013 :

    I client sono diversi (Web asp.net, iPhone, WindowsPhone, Android), per questo si è scelto di utilizzare WCF REST.

    se lato server passi a WebAPI hai tutto quello che ti serve per il tuo scenario specifico, scenario nel quale non sfrutti tutto quello che c'è di interessante in WCF a quanto mi par di capire.

    La soluzione che mi hai suggerito tu potrebbe funzionare, ma non mi piace molto. E non credo che piaccia nemmeno al cliente finale. La richiesta infatti è di un login interno all'applicazione.

    è la soluzione standard, come approccio, per qualsiasi servizio federato, la usiamo tutti i giorni quando ad esempio accediamo da una app per twitter a twitter.

    Quello che mi hai detto per il client, va benissimo, ovvero che ad ogni richiesta che fa ci appende il cookie così com'è, senza preoccuparsi di cosa ci sia dentro. Benissimo!!!! Il problema infatti io l'ho sul server. Non riesco a far funzionare il WCF con l'autenticazione utilizzando la sqlMembershipProvider.
    Il codice che ho fatto è circa questo:

    <behavior name="MembershipBehavior">
        <serviceAuthorization principalPermissionMode="UseAspNetRoles"
    roleProviderName="SqlRoleProvider" />     <serviceCredentials>
            <userNameAuthentication
    userNamePasswordValidationMode="MembershipProvider"
        membershipProviderName="SqlMembershipProvider"/>     </serviceCredentials>
    </behavior>
    

    Quello che non riesco a fare è agganciare il WCF alla membership, nonostante il codice scritto sopra. Ho letto anche in giro di come utilizzare l'autenticazione Basic, ma stessa cosa, ho problema con la configurazione sul server.

    è perché con WCF le cose non sono così semplici :-)

    ciao grazie

    .m



    blog @ //milestone.topics.it
    Tuesday, April 23, 2013 1:46 PM
  • Non ho mai usato WebAPI, e visto che domani devo consegnare.... non so se rifare tutto da capo. Non saprei da dove partire, cosa installare ecc ecc.

    [quote]è la soluzione standard, come approccio, per qualsiasi servizio federato, la usiamo tutti i giorni quando ad esempio accediamo da una app per twitter a twitter.[/quote]

    mmm, come si farebbe? mi puoi dare qualche suggerimento o link?
    grazie


    Programamtore ASP.NET
    http://glucolo.wordpress.com

    Tuesday, April 23, 2013 3:45 PM
  • Ciao Glauco,

    You wrote on 23/04/2013 :

    Non ho mai usato WebAPI, e visto che domani devo consegnare.... non so se rifare tutto da capo. Non saprei da dove partire, cosa installare ecc ecc.

    sarebbe tutto mostruosamente più semplice, perché alla fine è un'applicazione web, quello che puoi fare con WebAPI è un subset di quello che puoi fare con WCF, ha un paradigma molto diverso e per certi versi molto più facile, diciamo che il tempo di startup da zero a faccio tutto (in uno scenario come il tuo) è veramente breve.

    [quote]è la soluzione standard, come approccio, per qualsiasi servizio federato, la usiamo tutti i giorni quando ad esempio accediamo da una app per twitter a twitter.[/quote]

    mmm, come si farebbe? mi puoi dare qualche suggerimento o link?

    è facilissimo:
    - Da VS crea un'applicazione web;
    - attiva l'autenticazione con la FormsAuthentication in modo che usi la tua configurazione;
    - prova l'applicazione con il browser;
    - se va tutto e riesci ad autenticarti con Fiddler guardi il traffico http che il browser genera;
    - noterai ad esempio che quando fai la chiamata ad una pagina protetta l'applicazione ti risponde con un preciso messaggio http;
    - il browser a questo punto va sulla pagina di login;
    - ti autentichi e il browser riceve i cookie di autenticazione (ma non sa che lo sono non gli interessa)
    - il browser a questo punto riprova a tornare alla pagina protetta portandosi dietro i cookie, perché è il suo lavoro quindi lo fa da solo;

    ...e magicamente, perché server side la forms authentication legge i cookie, tutto funziona;

    ora invece di fare quell'handshacking dal browser fai la stessa cosa con il controllo webbrowser dentro la tua applicazione e quando la risposta http contiene i cookie della forms authentication, sia queli sono perché hai sbirciato con fiddler, sai che l'autenticazione è finita, salvi in locale i cookie e chiudi il controllo web browser.

    Questa cosa è una sorta di federazione manuale un po' preistorica ma alla fine quello è, si potrebbe ragionare su ws-federation o oauth ma le cose si complicano parecchio e non mi sembra ti interessi proprio.

    ti resta il problema che per far digerire forms auth a WCF non è così semplice e devi in tutti i casi rendere sicuro il trasporto quindi SSL.

    grazie

    .m



    blog @ //milestone.topics.it
    Wednesday, April 24, 2013 5:25 AM