6 messaggi dal 04 ottobre 2012
Ciao a tutti,

Ho realizzato un servizio WCF Data Service per interagire con il db attraverso diverse applicazioni client.
Essendo dedicato ad una piccola realtà, ho fatto in modo che ogni utente avesse il suo account sul server SQL con le diverse autorizzazioni, così ognuno si collega con il suo account. Per fare questo passo al servizio, nelle headers del messaggio, le informazioni su user e password, e costruisco la stringa di connessione da passare poi al mio DbContext nel metodo CreateDateSource(), con l'oggetto SqlConnectionStringBuilder.
Il problema si presenta quando il nome utente presenta degli spazi interni (per esempio USR 001), in quanto la stringa di connessione restituita da SqlConnectionStringBuilder mi inserisce i caratteri /" prima e dopo il nome utente (/"USR 001"/), e il metodo CreateDataSource() mi restituisce un'errore di inizializzione della connessione per stringa non valida.

Non volendo ridefinire gli utenti sul server togliendo gli spazi, ho pensato di inserire la stringa di connessione fissa costruita concatenando le diverse stringhe, ma mi sembra poco funzionale.

Volevo chiedere, prima di tutto, se sto utilizzando un approccio corretto o se è preferibile correggere qualcosa.

Grazie in anticipo,
Ciao

Michele
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
qualcosa non mi torna perché il SqlConnectionStringBuilder non dovrebbe aggiungere anche lo slash, ma solo i doppi apici intorno allo username. E' possibile che tu gli stia passando uno username che contiene già i doppi apici o comunque altri caratteri speciali?

Comunque, pensaci, se producesse stringhe di connessione non valide, il bug sarebbe già stato sistemato.

Prova ad ispezionare lo username che gli passi, controlla che non contenga altri caratteri oltre a USR 001


Volevo chiedere, prima di tutto, se sto utilizzando un approccio corretto o se è preferibile correggere qualcosa.

Sì, va bene come stai facendo se ti trovi più a tuo agio nel gestire i permessi al livello di database.
L'alternativa sarebbe quella di autorizzare l'accesso alle risorse mediante interceptors (QueryInterceptor e ChangeInterceptor). Così, se ne avessi la necessità, potresti definire delle politiche di accesso un po' più raffinate. Per esempio: anziché consentire/bloccare l'accesso all'intera tabella potresti limitare l'utente alla lettura dei soli record di cui è autore. Il QueryInterceptor infatti ti dà la possibilità di aggiungere dei criteri in AND alla query creata dall'utente per mezzo della sintassi OData.

ciao,
Moreno

Enjoy learning and just keep making
6 messaggi dal 04 ottobre 2012
Ciao,

Grazie per la risposta.
Dopo varie prove sono giunto alla conclusione che il costruttore del DbContext che riceve la stringa di connessione non funziona quando l'utente ha degli spazi. La stessa stringa di connessione funziona se utilizzata per istanziare direttamente un oggetto SqlConnection.

Ho deviato la rotta verso l'autenticazione basata su membership provider, però sto avendo problemi ad applicarla al servizio di data service (mentre funziona senza problemi nei servizi "normali").

Non riesco a trovare esempi in rete sul come si fa a configurare un WCF Data Service per utilizzare il membership provider per l'autenticazione (basata su Username e non su Form).
Qualcuno sa darmi una mano?

Grazie, ciao
Michele
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Michele,

Prova questo, c'è anche una demo da scaricare.
http://weblogs.asp.net/cibrax/archive/2009/03/20/custom-basic-authentication-for-restful-services.aspx

Ti mostra come far validare username e password ad un MembershipProvider. Le credenziali, in questo caso, arrivano mediante Basic Authentication, cioè sono state inserite dal client nell'intestazione Authorization della richiesta HTTP.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.