public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
        {
            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
            if (loginInfo == null)
            {
                return RedirectToAction("Login");
            }

            // Sign in the user with this external login provider if the user already has a login
            var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
            switch (result)
            {
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
                case SignInStatus.Failure:
                default:
                    // If the user does not have an account, then prompt the user to create an account
                    ViewBag.LoginProvider = loginInfo.Login.LoginProvider;

                    // Get the information about the user from the external login provider
                    var identity = loginInfo.ExternalIdentity;
                    string email = loginInfo.Email;
                    string name = identity.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:name").Value;
                    string accessToken = identity.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:accesstoken").Value;
                    string url = identity.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:url").Value;

                    // check they are authorised
                    RAGContext rag = new RAGContext();
                    var permittedUsers = rag.PermittedUsers.Where(p => p.Email == email);

                    if (permittedUsers != null && permittedUsers.Count() == 1)
                    {
                        var permitted = permittedUsers.First();

                        var user = new ApplicationUser { UserName = email, Email = email, FullName = name, LinkedInProfile = url, LinkedInToken = accessToken, PermittedUser=permitted };

                        var createResult = await UserManager.CreateAsync(user);
                        if (createResult.Succeeded)
                        {
                            // set roles                            
                            if(!string.IsNullOrEmpty(permitted.Roles))
                            {
                                string[] roles = permitted.Roles.Split(new char[] { ',' });

                                foreach (string role in roles)
                                {
                                    await this.UserManager.AddToRoleAsync(user.Id, role);
                                }
                            }

                            createResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login);
                            if (createResult.Succeeded)
                            {
                                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                                return RedirectToLocal(returnUrl);
                            }
                        }
                    }

                    ExternalLoginFailureViewModel model = new ExternalLoginFailureViewModel(email);
                    return View("ExternalLoginFailure", model);
            }
        }
        public ActionResult Apply(ExternalLoginFailureViewModel model)
        {
            MessageHandler.SendEmailAsync("*****@*****.**", "Application for access to innovation.org.je", string.Format("{0} has requested access.", model.EmailAddress));

            return View("ApplicationSent");
        }