2009-07-28 12 views
17

Sto lavorando con i servizi Silverlight RIA e voglio creare un'autenticazione personalizzata. Questa sembra essere l'unica cosa che non ha praticamente alcuna documentazione (ho letto l'intero RIAServicesOverview.docx).Servizi RIA: come posso creare un'autenticazione personalizzata?

Conoscete un modo per creare un servizio di autenticazione del cliente? Non voglio utilizzare il modello di appartenenza ASP.NET predefinito. Non so quale interfaccia o classe astratta devo implementare, sebbene abbia trovato System.Web.Ria.ApplicationServices.IAuthentication.

Devo implementare IAuthentication? Se è così, potresti darmi qualche consiglio su come fare per farlo? Questi sono i seguenti metodi:

public User GetUser(); 

    public User Login(string userName, string password, bool isPersistent, string customData); 

    public User Logout(); 

    public void UpdateUser(User user); 

non so come avrei fatto realizzare qualsiasi di questi (ad eccezione di Accesso) - come potrebbe il servizio forse sapere quale utente è attualmente connesso in modo Logout() per lavoro?

Sto setacciando il Web alla ricerca di come farlo per ore e non riesco a trovare nulla che descriva come creare un DomainService semplice che può essere utilizzato per autenticare un utente in un "RIA-linked "Progetto Silverlight.

Se qualcuno potesse far luce su questo, sarei sinceramente grato.

Grazie,
Charles


[EDIT]
ho trovato il RIA Services page on the MSDN Code Gallery. C'è una sezione chiamata Authentication Samples, che collega ad alcuni grandi esempi di codice. Controllalo se vuoi sapere di più su come funziona l'autenticazione all'interno dei Servizi RIA.

risposta

20

Se si crea una "Applicazione aziendale Silverlight", vedremo come il modello implementa l'autenticazione. (O semplicemente andare here and download the template sample project.)

Per semplificare, ecco il processo che ho usato:

In primo luogo, crea un servizio di dominio (FooService) che deriva dalla LinqToEntitiesDomainService dove FooContext è il mio modello di entità. In esso aggiungo tutte le operazioni CRUD per accedere alla mia tabella DB personalizzata e restituire i profili utente.

successivo, creare una classe utente di cemento sul lato server derivando da UserBase:

using System.Web.Ria; 
using System.Web.Ria.ApplicationServices; 

public class User : UserBase 
{} 

Infine, derivare una classe da AuthenticationBase e implementare i seguenti quattro metodi:

[EnableClientAccess] 
public class AuthenticationService : AuthenticationBase<User> 
{ 
    private FooService _service = new FooService(); 

    protected override bool ValidateUser(string username, string password) 
    { 
     // Code here that tests only if the password is valid for the given 
     // username using your custom DB calls via the domain service you 
     // implemented above 
    } 

    protected override User GetAuthenticatedUser(IPrincipal pricipal) 
    { 
     // principal.Identity.Name will be the username for the user 
     // you're trying to authenticate. Here's one way to implement 
     // this: 
     User user = null; 
     if (this._service.DoesUserExist(principal.Identity.Name)) // DoesUserExist() is a call 
                    // added in my domain service 
     { 
      // UserProfile is an entity in my DB 
      UserProfile profile = this._service.GetUserProfile(principal.Identity.Name); 
      user.Name = profile.UserName; 
      user.AuthenticationType = principal.Identity.AuthenticationType; 
     } 
     return user; 
    } 

    public override void Initialize(DomainServiceContext context) 
    { 
     this._service.Initialize(context); 
     base.Initialize(context); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      this._service.Dispose(); 
     base.Dispose(disposing); 
    } 
} 
+0

Grazie, questo è quello che stavo cercando. Cheers – Charles

+0

* cercando * ... Le mie dita burro e non mi dispiacerebbe un'opzione di modifica per i commenti ... – Charles

+0

Per favore, potresti spiegare questa risposta in modo un po 'più dettagliato?Sto davvero cercando di implementare solo l'autenticazione normale e non riesco a trovare alcuna buona fonte di informazione che non sia totalmente ambigua e che presuma già la conoscenza. Gradirei davvero un aiuto. – Goober

0

ne dite di attuazione l'interfaccia IAuthorization?

Problemi correlati