public ActionResult Index()
 {
     var userAuthStateId = Settings.GetUserAuthStateId(ControllerContext.HttpContext);
     //todo: add support for Google and other auth providers
     if (Data.GetUserSessionToken(userAuthStateId, Settings.AzureADAuthority) != null)
     {
         return RedirectToAction("Index", "Message");
     }
     ViewBag.StateKey = userAuthStateId;
     var tk = new SessionToken();
     return View(tk);
 }
        public static async Task<DropBoxSpaceUsage> GetDropBoxSpaceUsage(SessionToken token)
        {
            var url = "https://api.dropboxapi.com/2/users/get_space_usage";
            DropBoxSpaceUsage usage = null;
            using (var client = new HttpClient())
            {
                using (var request = new HttpRequestMessage(HttpMethod.Post, url))
                {
                    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);

                    using (var response = await client.SendAsync(request))
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            usage =
                                JsonConvert.DeserializeObject<DropBoxSpaceUsage>(
                                    await response.Content.ReadAsStringAsync());
                        }
                    }
                }
            }
            return usage;
        }
        private static async Task SaveAuthToken(AuthState authState, OAuthResult authResult, FacebookUserProfile userProfile)
        {
            using (var db = new AddInContext())
            {
                var existingToken =
                    await
                        db.SessionTokens.FirstOrDefaultAsync(
                            t => t.Provider == Settings.FacebookAuthority && t.Id == authState.stateKey);
                if (existingToken != null)
                {
                    db.SessionTokens.Remove(existingToken);
                }

                var token = new SessionToken()
                {
                    Id = authState.stateKey,
                    CreatedOn = DateTime.Now,
                    AccessToken = authResult.access_token,
                    Provider = Settings.FacebookAuthority,
                    Username = userProfile.id,
                };
                db.SessionTokens.Add(token);
                await db.SaveChangesAsync();
            }
        }
        private static async Task SaveAuthToken(AuthState authState, OAuthResult authResult)
        {
            var idToken = SessionToken.ParseJwtToken(authResult.id_token);
            string username = null;
            var userNameClaim = idToken.Claims.FirstOrDefault(x => x.Type == "upn" || x.Type == "preferred_username");
            if (userNameClaim != null)
                username = userNameClaim.Value;

            using (var db = new AddInContext())
            {
                var existingToken =
                    await
                        db.SessionTokens.FirstOrDefaultAsync(
                            t => t.Provider == Settings.AzureAD2Authority && t.Id == authState.stateKey);
                if (existingToken != null)
                {
                    db.SessionTokens.Remove(existingToken);
                }

                var token = new SessionToken()
                {
                    Id = authState.stateKey,
                    CreatedOn = DateTime.Now,
                    AccessToken = authResult.access_token,
                    Provider = Settings.AzureAD2Authority,
                    Username = username,
                };
                db.SessionTokens.Add(token);
                await db.SaveChangesAsync();
            }
        }
        private static async Task SaveAuthToken(AuthState authState, OAuthResult authResult)
        {
            using (var db = new AddInContext())
            {
                var existingToken =
                    await
                        db.SessionTokens.FirstOrDefaultAsync(
                            t => t.Provider == Settings.GoogleAuthority && t.Id == authState.stateKey);
                if (existingToken != null)
                {
                    db.SessionTokens.Remove(existingToken);
                }
                string username = null;
                var jwt = SessionToken.ParseJwtToken(authResult.id_token);
                var emailClaim = jwt.Claims.FirstOrDefault(c => c.Type == "email");
                if (emailClaim != null)
                    username = emailClaim.Value;

                var token = new SessionToken()
                {
                    Id = authState.stateKey,
                    CreatedOn = DateTime.Now,
                    AccessToken = authResult.access_token,
                    Provider = Settings.GoogleAuthority,
                    Username = username,
                };
                db.SessionTokens.Add(token);
                await db.SaveChangesAsync();
            }
        }