示例#1
0
        internal static void AddDebugPurposeUserToken()
        {
            var token = UserToken.GenerateNew("meet", new string[] { "admin", "users" }, new Claim[] { new Claim("poi-categories", "") }, TimeSpan.FromMinutes(60), "web", "test");

            _userCache.Add(new CacheItem("meet", token), new CacheItemPolicy()
            {
                SlidingExpiration = token.SlidingExpiration
            });
        }
示例#2
0
        public static void AddDebugPurposeUserToken2(string Token, string[] Roles, Claim[] Claims, TimeSpan Expire, string DbName)
        {
            var token = UserToken.GenerateNew(Token, Roles, Claims, Expire, "web", DbName);

            _userCache.Add(new CacheItem(Token, token), new CacheItemPolicy()
            {
                SlidingExpiration = token.SlidingExpiration
            });
        }
示例#3
0
        /// <summary>
        /// Kullanıcının login olup yeni bir token üretmesini sağlar.
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static async Task <LoginOutput> Login(LoginInput info)
        {
            // Get users collection
            var users = App.MeetAppUsers;

            // Query user
            var filter = Builders <BsonDocument> .Filter.Eq("usr", info.usr);

            var user = await users.Find(filter).FirstOrDefaultAsync();

            // Kullanıcı bulunamadı
            if (user == null)
            {
                return(LoginOutput.UserNotFound());
            }

            // Şifreyi al
            var password = user["pwd"].AsString;

            // Şifresi hatalı: beyan edilen ile aynı değil
            if (password != info.pwd)
            {
                return(LoginOutput.InvalidPassword());
            }

            // App hatalı
            if (!user["apps"].AsBsonDocument.Contains(info.appName))
            {
                return(LoginOutput.InvalidApp());
            }

            // App var ve okuduk
            var app = user["apps"][info.appName].AsBsonDocument;

            // Remove expires tokens: Expire etmiş olanlar temizlendi.
            // Elimizde temiz token listesi var.
            var tokens = removeExpiredTokens(app);

            var allowRecycle  = app["allowRecycle"].AsBoolean;
            var totalCapacity = app["totalToken"].AsInt32;

            // Token yaratmak için yeterli kapasite yok.
            if (!allowRecycle && totalCapacity == tokens.Count)
            {
                return(LoginOutput.TooManyUsersLoggedIn());
            }

            // Token yarat
            var username = user["usr"].AsString;
            var roles    = user["roles"].AsString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var claims   = getClaims(user["claims"].AsBsonDocument);
            var dbName   = claims.GetValueFromClaim("gm-database");


            // Demek ki sisteme veritabanı kaydedilmemiş.
            if (dbName == null)
            {
                return(LoginOutput.InvalidDb());
            }

            // Kullanıcıyı yarat
            var token = UserToken.GenerateNew(username, roles, claims, TimeSpan.FromMinutes(info.slidingExpiration), info.appName, dbName);

            // Kapasite dolu ise eskilerden birisini sileceksin.
            if (tokens.Count == totalCapacity)
            {
                removeOldestToken(tokens);
            }

            // Yeni token eklensin
            tokens.Add(new BsonDocument()
            {
                { "token", token.Token },
                { "createdAt", DateTime.Now },
                { "slideExpireInMinutes", (int)token.SlidingExpiration.TotalMinutes }
            });

            // Update database
            var f = Builders <BsonDocument> .Filter.Eq("usr", user["usr"].AsString);

            await users.ReplaceOneAsync(f, user);

            // add to cache
            _userCache.Add(new CacheItem(token.Token, token), new CacheItemPolicy()
            {
                SlidingExpiration = token.SlidingExpiration,
                RemovedCallback   = CacheEntryRemovedCallback
            });

            return(LoginOutput.OK(token));
        }