Ejemplo n.º 1
0
        public async Task <IActionResult> ScopeAsync(int resourceId, int id)
        {
            var resource = await _dbContext.ApiResources.FirstOrDefaultAsync(x => x.Id == resourceId);

            if (resource == null)
            {
                return(BadRequest());
            }

            var scope = await _dbContext.ApiScopes.FirstOrDefaultAsync(x => x.Id == id);

            if (scope == null)
            {
                return(BadRequest());
            }

            if (scope.ApiResourceId != resourceId)
            {
                return(BadRequest());
            }

            var viewModel = new ApiResourceScopeViewModel
            {
                Name                    = scope.Name,
                Required                = scope.Required,
                Emphasize               = scope.Emphasize,
                Description             = scope.Description,
                ShowInDiscoveryDocument = scope.ShowInDiscoveryDocument,
                DisplayName             = scope.DisplayName
            };
            var claims = await _dbContext.ApiScopeClaims.Where(x => x.ApiScopeId == id).Select(x => x.Type)
                         .ToListAsync();

            viewModel.UserClaims      = string.Join(" ", claims);
            ViewData["ApiResource"]   = resource.Name;
            ViewData["ApiResourceId"] = resourceId;
            ViewData["ScopeId"]       = id;
            return(View("ViewScope", viewModel));
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> CreateScopeAsync(int id, ApiResourceScopeViewModel dto)
        {
            if (!ModelState.IsValid)
            {
                return(View("CreateScope", dto));
            }

            var resource = await _dbContext.ApiResources.FirstOrDefaultAsync(u => u.Id == id);

            if (resource == null)
            {
                return(NotFound());
            }

            dto.Name = dto.Name.Trim();
            var scope = new ApiScope
            {
                Name                    = dto.Name,
                Description             = dto.Description?.Trim(),
                DisplayName             = string.IsNullOrWhiteSpace(dto.DisplayName) ? dto.Name : dto.DisplayName?.Trim(),
                Required                = dto.Required,
                ShowInDiscoveryDocument = dto.ShowInDiscoveryDocument,
                Emphasize               = dto.Emphasize,
                ApiResource             = resource
            };
            var context     = (DbContext)_dbContext;
            var transaction = context.Database.BeginTransaction();

            try
            {
                var claimTypes = dto.UserClaims?.Split(" ", StringSplitOptions.RemoveEmptyEntries);
                var claims     = new List <ApiScopeClaim>();
                if (claimTypes != null)
                {
                    foreach (var claimType in claimTypes)
                    {
                        claims.Add(new ApiScopeClaim
                        {
                            Type     = claimType,
                            ApiScope = scope
                        });
                    }
                }

                scope.UserClaims = claims;
                await _dbContext.ApiScopes.AddAsync(scope);

                await _dbContext.SaveChangesAsync();

                transaction.Commit();
                return(Redirect($"/api-resource/{id}/scope"));
            }
            catch (Exception e)
            {
                Logger.LogError($"Add scope failed: {e}");
                try
                {
                    transaction.Rollback();
                }
                catch (Exception te)
                {
                    Logger.LogError($"Rollback add scope failed: {te}");
                }

                ModelState.AddModelError(string.Empty, "Add scope failed");
                return(View("CreateScope", dto));
            }
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> UpdateScopeAsync(int resourceId, int id, string returnUrl,
                                                           ApiResourceScopeViewModel dto)
        {
            if (!ModelState.IsValid)
            {
                return(View("ViewScope", dto));
            }

            var resource = await _dbContext.ApiResources.FirstOrDefaultAsync(x => x.Id == resourceId);

            if (resource == null)
            {
                return(BadRequest());
            }

            var scope = await _dbContext.ApiScopes.FirstOrDefaultAsync(x => x.Id == id);

            if (scope == null)
            {
                return(BadRequest());
            }

            if (scope.ApiResourceId != resourceId)
            {
                return(BadRequest());
            }

            dto.Name                      = dto.Name.Trim();
            scope.Name                    = dto.Name;
            scope.Description             = dto.Description?.Trim();
            scope.DisplayName             = string.IsNullOrWhiteSpace(dto.DisplayName) ? dto.Name : dto.DisplayName?.Trim();
            scope.Required                = dto.Required;
            scope.ShowInDiscoveryDocument = dto.ShowInDiscoveryDocument;
            scope.Emphasize               = dto.Emphasize;
            var oldClaims = await _dbContext.ApiScopeClaims.Where(x => x.ApiScopeId == scope.Id)
                            .ToListAsync();

            var context     = (DbContext)_dbContext;
            var transaction = context.Database.BeginTransaction();

            try
            {
                _dbContext.ApiScopeClaims.RemoveRange(oldClaims);

                var claimTypes = dto.UserClaims?.Split(" ", StringSplitOptions.RemoveEmptyEntries);
                var claims     = new List <ApiScopeClaim>();
                if (claimTypes != null)
                {
                    var list = claimTypes.ToList();
                    list.Sort();
                    foreach (var claimType in list)
                    {
                        claims.Add(new ApiScopeClaim
                        {
                            Type     = claimType,
                            ApiScope = scope
                        });
                    }
                }

                scope.UserClaims = claims;
                _dbContext.ApiScopes.Update(scope);
                await _dbContext.SaveChangesAsync();

                transaction.Commit();
                return(Redirect($"/api-resource/{resourceId}/scope"));
            }
            catch (Exception e)
            {
                Logger.LogError($"Update scope failed: {e}");
                try
                {
                    transaction.Rollback();
                }
                catch (Exception te)
                {
                    Logger.LogError($"Rollback update scope failed: {te}");
                }

                ModelState.AddModelError(string.Empty, "Update scope failed");
                return(View("ViewScope", dto));
            }
        }