Usługi RIA: Jak mogę utworzyć własne uwierzytelnianie?

Pracuję z usługami Silverlight RIA i chcę stworzyć własne uwierzytelnianie. Wydaje się, że jest to jedyna rzecz, która nie ma praktycznie żadnej dokumentacji (przeczytałem cały RIAServicesOverview.docx).

Czy znasz sposób dla mnie, aby utworzyć usługę uwierzytelniania klienta? Nie chcę używać domyślnego ASP.NET model członkostwa. Nie wiem jaki interfejs lub klasę abstrakcyjną muszę zaimplementować - chociaż znalazłem System.Www.Ria.ApplicationServices.IAuthentication.

Czy muszę wdrożyć IAuthentication? Jeśli tak, czy mógłbyś mi doradzić, jak to zrobić? Są to następujące metody:

    public User GetUser();

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

    public User Logout();

    public void UpdateUser(User user);

Nie wiem jak zaimplementowałbym którekolwiek z nich ( oprócz logowania) - skąd usługa może wiedzieć, który użytkownik jest aktualnie zalogowany, aby funkcja Logout() działała?

Przeszukuję sieć w poszukiwaniu tego, jak to zrobić od kilku godzin i nie mogę znaleźć niczego, co opisuje, jak utworzyć prostą usługę DomainService, która może być używana do uwierzytelniania użytkownika w projekcie Silverlight "Ria-linked".

Gdyby ktoś mógł rzucić na to trochę światła, byłbym szczerze wdzięczny.

Dzięki,
Karol


[EDIT]
Znalazłem stronę RIA Services w Galerii kodu MSDN . Jest sekcja o nazwie Authentication Samples , która łączy się z kilkoma wspaniałymi przykładami kodu. Sprawdź, jeśli chcesz wiedzieć więcej o tym, jak działa uwierzytelnianie w ramach Usług RIA.

Author: Charles, 2009-07-28

3 answers

Jeśli utworzysz "aplikację biznesową Silverlight", zobaczysz, jak szablon implementuje uwierzytelnianie. (Lub po prostu przejdź tutaj i pobierz przykładowy projekt szablonu .)

Aby uprościć, oto proces, którego użyłem:

Najpierw tworzę usługę domenową (FooService), która wywodzi się z LinqToEntitiesDomainService, gdzie FooContext jest moim modelem encji. W nim dodaję wszystkie operacje CRUD, aby uzyskać dostęp do mojej niestandardowej tabeli DB i zwrócić profile użytkowników.

Następnie utwórz konkretna Klasa użytkownika po stronie serwera, wywodząca się z bazy UserBase:

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

public class User : UserBase
{}

Na koniec wyprowadź klasę z bazy AuthenticationBase i zaimplementuj następujące cztery metody:

[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);
    }
}
 20
Author: Nick Gotch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 14:31:04
 1
Author: Shimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-19 15:07:24

Może zaimplementujesz interfejs IAuthorization?

 0
Author: Abbas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-30 01:55:56