Simple membership provider - proszę o pomoc w zrozumieniu działania mechanizmu

0

Witam, czy byłby ktoś tak miły i pomógł mi zrozumieć jak działa kod z poniższych klas. Jest to fragment z Visual Studio -> MVC4 -> aplikacja internetowa.
Czytam o filtrach, o LazyInitializer ale nadal do końca nie rozumiem jak to działa - szczególnie fragment kodu do linii przerywanej.

namespace Authentication.Filters
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
    {
        private static SimpleMembershipInitializer _initializer;
        private static object _initializerLock = new object();
        private static bool _isInitialized;

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Ensure ASP.NET Simple Membership is initialized only once per app start
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }

//----------------------------------------------------------------------------------------
        private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer<UsersContext>(null);

                try
                {
                    using (var context = new UsersContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }

                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
 
//Tutaj już rozumiem wszystko
namespace Authentication.Models
{
    public class UsersContext : DbContext
    {
        public UsersContext()                        
            : base("DefaultConnection")
        {
        }

        public DbSet<UserProfile> UserProfiles { get; set; }
    }

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
    }

Chyba chciałbym skorzystać właśnie z Simple membership provider, żeby zastosować u mnie w aplikacji mechanim uwierzytelnienia użytkowników. Chociaż nie wiem czy to najlepszy wybór bo raczej da się to zrobić prościej co wnoszę z filmików ASP.NET dotyczących uwierzytelnienia.

0

up. Czyli za utworzenie w bazie danych tabel: UserProfile, webpages_Membership, webpages_Roles, webpages_UserInRoles, webpages_OAuthMemebrship odpowiada ta metoda?

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

Ale nadal nie rozumiem tego kodu do przerywanej linii. Tworzę filtr, który wykonuje się przed wykonaniem metody akcji. Metoda

LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 

wskazuję na klasę SimpleMembershipInitializer której obiekt tworzony jest dopiero w momencie kiedy jest potrzebny ? Nie wiem o co chodzi z tymi parametrami w tej metodzie.

0

Hmm... w MVC nie robiłem nic, ale stosowałem własnych memberszipów w aplikacjach ASP.
Przykład: http://www.codeproject.com/Articles/165159/Custom-Membership-Providers
Generalnie chodzi o utworzenie klasy dziedziczącej po MembershipProvider i wskazanie jej w web.conf dla potrzeb autentykacji. Metodę uwierzytelnienia możesz wtedy dostosować jak chcesz opierając się na własnych tabelkach Users, Roles i UsersInRoles czy co tam będziesz potrzebował.
M.

1 użytkowników online, w tym zalogowanych: 0, gości: 1