HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideLegal TermsGitHubNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev Guide

ASP.NET Identity Registrar

Describes how to use the ASP.NET Identity Registrar in Optimizely Commerce Connect 13.

📘

Note

This configuration requires the *EPiServer.Commerce.Security* NuGet package as dependency.

See also: ASP.NET Identity.

using EPiServer.Commerce.Security;
    using EPiServer.Framework;
    using EPiServer.Framework.Initialization;
    using EPiServer.ServiceLocation;
    using EPiServer.Web;
    using log4net;
    using Microsoft.AspNet.Identity;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Web.Routing;
    using System.Web.Security;
    
    namespace WebApplication1
      {
        [InitializableModule]
        [ModuleDependency(typeof(Mediachase.Commerce.Initialization.CommerceInitialization),
                          typeof(EPiServer.Commerce.Initialization.InitializationModule))]
        public class InitializeCommerceSiteModule : IConfigurableModule
          {
            public void Initialize(InitializationEngine context)
              {
              }
            public void Preload(string[] parameters)
              {
              }
            public void Uninitialize(InitializationEngine context)
              {
              }
            public void ConfigureContainer(ServiceConfigurationContext context)
              {
                context.Container.Configure(ce =>
                  {
                    ce.For<IRegistrar>().Singleton().Use(() => 
                      new IdentityRegistrar<ApplicationUser>(new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()))));
                  });
              }
          }
      }

When using the ASP.NET Identity registrar with MVC, you need to make all action results async since all ASP.NET Identity methods are async. The following example shows this when creating a new user.

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task Register(FormCollection model)
      {
        if (ModelState.IsValid)
          {
            string firstName = model["Email"];
            string lastName = model["Email"];
            string emailAddress = model["Email"];
            string password = model["Password"];
            var principal = await Task.Run(() => _registrar.CreateUser(emailAddress, password, emailAddress));
                    
            // Now create an account in the ECF 
            CustomerContact customerContact;
            if (_registrar is CustomerContactRegistrar)
              {
                customerContact = CustomerContext.Current.GetContactByUserId(
                  new MapUserKey(s => new ConvertStringUserKey()).ToTypedString(principal.Identity.Name));
              }
            else
              {
                customerContact = CustomerContact.CreateInstance(principal);
              }
            customerContact.FirstName = firstName;
            customerContact.LastName = lastName;
            customerContact.RegistrationSource = String.Format("{0}, {1}", this.Request.Url.Host, SiteContext.Current);
            customerContact["Email"] = emailAddress;
            customerContact.SaveChanges();
            await Task.Run(() =>_registrar.SignIn
              (
                new AuthenticationProperties()
                  {
                    IsPersistent = false
                  },
                  principal.Identity as ClaimsIdentity
              );
            return RedirectToAction("Index");
          }
    
        // If we got this far, something failed, redisplay form
        return View(model);
      }