Example #1
0
        public Task <Token> CreateServiceToken(RequestToken requestToken)
        {
            Token          tokenModel     = new Token();
            ClaimsIdentity claimsIdentity = new ClaimsIdentity();

            Database.Model.Application.ApplicationRepository application = new Database.Model.Application.ApplicationRepository();

            var model = _applicationRepository.ClientVerify(requestToken.ClientId, requestToken.Secret, requestToken.ClientScope, requestToken.ClientGrantType);

            if (!model.Success)
            {
                throw new Exception($"Cliente não encontrado. Erro: {model.ResultMessage}");
            }

            var tokenHandler = new JwtSecurityTokenHandler();

            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Expires            = DateTime.UtcNow.AddHours(2),
                SigningCredentials = new SigningCredentials(
                    new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Model.Services.Struct.Authentication.Token.Key)),
                    SecurityAlgorithms.HmacSha256Signature
                    )
            };

            foreach (var item in model.Scope)
            {
                claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, item.Name));
            }

            claimsIdentity.AddClaim(new Claim(ClaimTypes.SerialNumber, model.Secret.SecretValue));
            claimsIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, model.Client.UniqueKey));
            claimsIdentity.AddClaim(new Claim(ClaimTypes.GivenName, model.GrantType.Type));

            tokenDescriptor.Subject = claimsIdentity;

            tokenHandler.CreateToken(tokenDescriptor);


            tokenModel.DateValidade = tokenDescriptor.Expires;
            tokenModel.TokenAccess  = tokenHandler.WriteToken(tokenHandler.CreateToken(tokenDescriptor)).ToString();
            return(Task.FromResult(tokenModel));
        }
Example #2
0
        public Model.Application.ApplicationRepository ClientVerify(string UniqueKey, string SecretValue, List <string> Scopes, string grantType)
        {
            Model.Application.ApplicationRepository application = new Model.Application.ApplicationRepository();
            try
            {
                //Configura modelo para fazer verificação
                application = new Database.Model.Application.ApplicationRepository()
                {
                    Client = new Client()
                    {
                        UniqueKey = UniqueKey
                    },
                    Secret = new Secret()
                    {
                        FK_UniqueKeyApp = UniqueKey
                    },
                    ListGrantType = new ClitGrantType()
                    {
                        ClientId = UniqueKey
                    },
                    ListScope = new List <ClitScopes>(),
                };

                application.Client = _clientRepository.ListByUniqueKey(application.Client);
                if (application.Client == null)
                {
                    throw new Exception("UniqueKey não foi encontrada na base de dados.");
                }

                application.Secret = _secretRepository.ListById(application.Secret);
                if (application.Secret.SecretValue != SecretValue || application.Secret == null)
                {
                    throw new Exception("UniqueKey não foi vinculada a um Segredo solicitado na base de dados.");
                }

                application.ListGrantType = _clitGranTypeRepository.ListById(application.ListGrantType);
                if (application.ListGrantType == null)
                {
                    throw new Exception("UniqueKey não foi vinculada a um GrantType na base de dados.");
                }

                application.ListScope = _clitScopesRepository.ListById(new ClitScopes()
                {
                    ClientId = UniqueKey
                });

                if (Scopes.Count != application.ListScope.Count)
                {
                    throw new Exception("Não foram passados todos os escopos para acessar Client");
                }

                //Usa o ID dos escopos para buscar as definições
                application.Scope = new List <Scope>();
                foreach (var item in application.ListScope)
                {
                    var scopeModel = new Scope()
                    {
                        Id = item.ScopeId,
                    };

                    application.Scope.Add(_scopeRepository.ListById(new Scope()
                    {
                        Id = item.ScopeId
                    }));
                }

                if (application.Scope == null)
                {
                    throw new Exception("UniqueKey não foi vinculada a nenhum Escopo na base de dados.");
                }

                foreach (var item in Scopes)
                {
                    if (!application.Scope.Exists(s => s.Name == item))
                    {
                        throw new Exception($"Escopo {item} não foi atribuido para o Client {application.Client.UniqueKey}");
                    }
                }

                application.GrantType = _grantTypeRepository.ListById(new GrantType()
                {
                    Id = application.ListGrantType.GrantTypeId
                });

                if (application.GrantType.Type != grantType)
                {
                    throw new Exception($"Grant_Type {grantType} não foi atribuido para o Client {application.Client.UniqueKey}");
                }

                application.Success       = true;
                application.ResultMessage = "Client encontrado com sucesso";
            }
            catch (Exception ex)
            {
                application.Success       = false;
                application.ResultMessage = $"Ocorreu um erro durante a operação, Descrição: {ex.Message}";
            }

            return(application);
        }
        public Task <Database.Model.Application.ApplicationRepository> CreateApplication(Sys.Model.Services.Application.Application application)
        {
            Database.Model.Application.ApplicationRepository modelApplication = new Database.Model.Application.ApplicationRepository();

            #region Criar Aplicacao
            modelApplication.Client = new Client()
            {
                Active       = true,
                DateRegister = DateTime.Now,
                Name         = application.Name,
                Descrition   = application.Descrition,
                UniqueKey    = Guid.NewGuid().ToString(),
            };

            modelApplication.Client = _applicationRepository.CreateApplication(modelApplication.Client);

            modelApplication.UniqueKey = modelApplication.Client.UniqueKey;
            #endregion

            #region Criar Segredo da Aplicação
            modelApplication.Secret = new Secret()
            {
                DataRegister    = DateTime.Now,
                SecretValue     = application.SecretValue,
                FK_UniqueKeyApp = modelApplication.Client.UniqueKey
            };

            modelApplication.Secret = _applicationRepository.CreateSecret(modelApplication.Secret);
            #endregion

            #region Criar Escopos
            List <Scope> listScopeResult = new List <Scope>();

            foreach (var item in application.Scopes)
            {
                var model = new Scope()
                {
                    Name         = item.ScopeName,
                    Description  = item.Description,
                    DataRegister = System.DateTime.Now
                };

                listScopeResult = _applicationRepository.CreateScopes(model);
            }
            #endregion

            #region Configurar Escopos da Aplicação
            modelApplication.Scope = new List <Scope>();

            foreach (var item in listScopeResult)
            {
                if (application.Scopes.Exists(ap => ap.ScopeName == item.Name))
                {
                    _applicationRepository.ConfigClientScop(
                        new ClitScopes
                    {
                        DataRegister = System.DateTime.Now,
                        ClientId     = modelApplication.Client.UniqueKey,
                        ScopeId      = listScopeResult.Find(scope => scope.Name == item.Name).Id
                    });

                    modelApplication.Scope.Add(item);
                }
            }

            #endregion

            #region Configurar GrantType da Aplicação
            List <ClitGrantType> listClitGrantTypeCreate = new List <ClitGrantType>();

            listClitGrantTypeCreate.Add(
                new ClitGrantType()
            {
                ClientId     = modelApplication.Client.UniqueKey,
                DataRegister = System.DateTime.Now,
                GrantTypeId  = _applicationRepository.GetGrantType(new GrantType()
                {
                    Type = application.GrantType
                }).Id
            });

            foreach (var item in listClitGrantTypeCreate)
            {
                _applicationRepository.ConfigClientGrantType(item);
            }

            modelApplication.GrantType = _applicationRepository.GetGrantType(
                new GrantType()
            {
                Type = application.GrantType
            });
            #endregion

            modelApplication.Success       = true;
            modelApplication.ResultMessage = "Aplicação Criada com Sucesso";

            return(Task.FromResult(modelApplication));
        }