Amazon Web Services   |   Tuesday, January 13, 2009 @ 10:25 PM EST
  print view | pdf
  permalink

Here is a very basic attempt at an Amazon SimpleDB / .NET Membership Provider.  This code allows for you to use ASP.NET login web controls such as login, loginview and loginstatus. 

It works for my testing purposes, but I didn’t extend all values in the membership object, just a few:

  • email
  • nickname
  • avatarlocation
  • password
  • passwordsalt
  • lowercasedemail
  • passwordquestion
  • passwordanswer
  • isapproved

You can use this as a starter for further extension.  I recommend reading MSDN’s How tp: Implement a Custom Membership Provider to understand what you can do with further extension.

To extend the MembershipProvider you need to use Members and MembersUser along with MembersProvider (DAO calls to SDB).

Below is an example of CreateUser with a MembershipUser returned.

   1: public override MembershipUser CreateUser(
   2:     string username,
   3:     string password,
   4:     string email,
   5:     string passwordQuestion,
   6:     string passwordAnswer,
   7:     bool isApproved,
   8:     object providerUserKey,
   9:     out MembershipCreateStatus status
  10:     )
  11: {
  12:     LoggingService.Debug("Start Members.CreateUser()");
  13:  
  14:     // From frontend, clean up incoming data
  15:     String nickname = username;
  16:     LoggingService.Debug("** nickname = " + nickname);
  17:     username = email;
  18:     LoggingService.Debug("** username = " + username);
  19:     LoggingService.Debug("** email = " + email);
  20:  
  21:     if ((username == null) || (username == String.Empty))
  22:     {
  23:         status = MembershipCreateStatus.InvalidUserName;
  24:         return null;
  25:     }
  26:  
  27:     if ((password == null) || (password == String.Empty))
  28:     {
  29:         status = MembershipCreateStatus.InvalidPassword;
  30:         return null;
  31:     }
  32:  
  33:     if ((email == null) || (email == String.Empty))
  34:     {
  35:         status = MembershipCreateStatus.InvalidEmail;
  36:         return null;
  37:     }
  38:  
  39:     email = email.ToLower();
  40:  
  41:     if (DAO.MembersProvider.DoesEmailExist(email.ToLower()))
  42:     {
  43:         status = MembershipCreateStatus.DuplicateEmail;
  44:         return null;
  45:     }
  46:  
  47:     // 1. hash password
  48:     Guid salt = Guid.NewGuid();
  49:     String hashedpassword = Helper.Password.Hash(password, salt.ToString());
  50:  
  51:     // call DAO.MembersProvider()
  52:     MembersUser m = new MembersUser();
  53:     m = DAO.MembersProvider.Create(email, nickname, " ", hashedpassword, salt, email.ToLower(), passwordQuestion, passwordAnswer, isApproved);
  54:     if (m != null)
  55:     {
  56:         status = MembershipCreateStatus.Success;
  57:         LoggingService.Debug("End Members.CreateUser() - success");
  58:         return m;
  59:     }
  60:     else
  61:     {
  62:         status = MembershipCreateStatus.ProviderError;
  63:         LoggingService.Error("End Members.CreateUser() - ERROR !!");
  64:         return null;
  65:     }
  66: }

Here is an example of the DAO.Create() with the actual calls to Amazon’s SimpleDB.

   1: public static MembersUser Create(
   2:             String email,
   3:             String nickname,
   4:             String avatarlocation,
   5:             String password,
   6:             Guid passwordsalt,
   7:             String lowercasedemail,
   8:             String passwordquestion,
   9:             String passwordanswer,
  10:             bool isapproved
  11:             )
  12:         {
  13:             LoggingService.Debug("Start DAO.MembersProvider.Create()");
  14:             
  15:             //create membersuser object
  16:             MembersUser m = new MembersUser();
  17:             m.Email = email;
  18:             //m.UserName = email;
  19:             //m.PasswordQuestion = passwordquestion;
  20:             m.Comment = "";
  21:             m.IsApproved = isapproved;
  22:             //m.CreationDate = DateTime.UtcNow;
  23:             m.LastLoginDate = DateTime.UtcNow;
  24:             m.LastActivityDate = DateTime.UtcNow;
  25:             //m.LastPasswordChangedDate = DateTime.UtcNow;
  26:             //m.LastLockoutDate = DateTime.UtcNow;
  27:             //m.IsOnline = true;
  28:  
  29:             try
  30:             {
  31:                 PutAttributes request = new PutAttributes().WithDomainName(MembersProvider.amznDomain).WithItemName(email);
  32:  
  33:                 List<ReplaceableAttribute> item = new List<ReplaceableAttribute>();
  34:  
  35:                 item.Add(new ReplaceableAttribute().WithName("Nickname").WithValue(nickname));
  36:                 LoggingService.Debug("** DAO.MembersProvider.Create() nickname = " + nickname);
  37:  
  38:                 item.Add(new ReplaceableAttribute().WithName("AvatarLocation").WithValue(avatarlocation));
  39:                 LoggingService.Debug("** DAO.MembersProvider.Create() avatarlocation = " + avatarlocation);
  40:  
  41:                 item.Add(new ReplaceableAttribute().WithName("Password").WithValue(password));
  42:                 LoggingService.Debug("** DAO.MembersProvider.Create() Password = " + password);
  43:  
  44:                 item.Add(new ReplaceableAttribute().WithName("PasswordSalt").WithValue(passwordsalt.ToString()));
  45:                 LoggingService.Debug("** DAO.MembersProvider.Create() PasswordSalt = " + passwordsalt.ToString());
  46:  
  47:                 item.Add(new ReplaceableAttribute().WithName("LowerCasedEmail").WithValue(lowercasedemail));
  48:                 LoggingService.Debug("** DAO.MembersProvider.Create() LowerCasedEmail = " + lowercasedemail);
  49:  
  50:                 item.Add(new ReplaceableAttribute().WithName("PasswordQuestion").WithValue(passwordquestion));
  51:                 LoggingService.Debug("** DAO.MembersProvider.Create() PasswordQuestion = " + passwordquestion);
  52:  
  53:                 item.Add(new ReplaceableAttribute().WithName("PasswordAnswer").WithValue(passwordanswer));
  54:                 LoggingService.Debug("** DAO.MembersProvider.Create() PasswordAnswer = " + passwordanswer);
  55:  
  56:                 item.Add(new ReplaceableAttribute().WithName("IsApproved").WithValue(isapproved.ToString()));
  57:                 LoggingService.Debug("** DAO.MembersProvider.Create() IsApproved = " + isapproved.ToString());
  58:  
  59:                 item.Add(new ReplaceableAttribute().WithName("IsLockedOut").WithValue(false.ToString()));
  60:                 LoggingService.Debug("** DAO.MembersProvider.Create() IsLockedOut = " + false.ToString());
  61:  
  62:                 item.Add(new ReplaceableAttribute().WithName("CreatedDate").WithValue(AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow)));
  63:                 LoggingService.Debug("** DAO.MembersProvider.Create() CreatedDate = " + AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow));
  64:  
  65:                 item.Add(new ReplaceableAttribute().WithName("LastLoginDate").WithValue(AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow)));
  66:                 LoggingService.Debug("** DAO.MembersProvider.Create() LastLoginDate = " + AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow));
  67:  
  68:                 item.Add(new ReplaceableAttribute().WithName("LastActivityTime").WithValue(AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow)));
  69:                 LoggingService.Debug("** DAO.MembersProvider.Create() LastActivityTime = " + AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow));
  70:  
  71:                 item.Add(new ReplaceableAttribute().WithName("LastPasswordChangedDate").WithValue(AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow)));
  72:                 LoggingService.Debug("** DAO.MembersProvider.Create() LastPasswordChangedDate = " + AmazonSimpleDB.Helper.ConvertDateTimeToISO8601(DateTime.UtcNow));
  73:  
  74:                 item.Add(new ReplaceableAttribute().WithName("FailedPasswordAttemptCount").WithValue(" "));
  75:                 LoggingService.Debug("** DAO.MembersProvider.Create() FailedPasswordAttemptCount = " + " ");
  76:  
  77:                 item.Add(new ReplaceableAttribute().WithName("IsClosed").WithValue(false.ToString()));
  78:                 LoggingService.Debug("** DAO.MembersProvider.Create() IsClosed = " + false.ToString());
  79:  
  80:                 request.Attribute = item;
  81:  
  82:                 // call custom InvokePut()
  83:                 DAO.AmazonSimpleDB.AmazonSimpleDBService amznDAO = new DAO.AmazonSimpleDB.AmazonSimpleDBService();
  84:                 amznDAO.InvokePutAttributes(request);
  85:  
  86:             }
  87:             catch (Exception ex)
  88:             {
  89:                 LoggingService.Error("** ERROR: " + ex.Message.ToString());
  90:                 return null;
  91:             }
  92:             finally
  93:             {
  94:                 // nothing
  95:             }
  96:             LoggingService.Debug("End DAO.MembersProvider.Create()");
  97:             return m;
  98:         }

If I get some time I will clean it up and make it easier for integration into existing projects.  I also will include my “create domains” code which will make creating the names in the domain easier.

Members.cs (DOWNLOAD)
MembershipProvider.cs (DOWNLOAD)
MembersUser.cs (DOWNLOAD)

Comments are closed

YOUR CRUMBS

[X]

SITE SEARCH powered by google

SITE POWERED BY

RECENT TWEETS (TWITTER)

  • "Attending a Microsoft Sharepoint training class all week"
    about 358 days ago
  • "Glued to the tv watching UConn and Syracuse now in 5th OT"
    about 362 days ago
  • "@microplaza nice!"
    about 370 days ago
  • RANDOM VIDEO CLIP

    ABOUT ME

    Simpsonized Me Hi, I'm Vikram Pant.

    On my site I share some ideas, solutions and other misc things I find online.

    During the day I work on various IT initiatives within the federal government. In my free time I enjoy reading up on, and testing out, new and emerging gadgets & technologies. (Read more)

    QUICK NOTE (E-MAIL)

    © 2009 Vikram Pant                 All Opinions Are My Own And Not That Of My Employer(s)