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)); }
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)); }