public async Task <IScimResult <ScimUser> > ValidateUpdate(string resourceAsString, string schema)
        {
            var user = JsonConvert.DeserializeObject <ScimUser>(resourceAsString);

            var schemaResult = HasExpectedSchemas(user, schema);

            if (schemaResult.Status == ScimResultStatus.Failure)
            {
                return(schemaResult);
            }

            if (string.IsNullOrWhiteSpace(user.Id))
            {
                return(ScimResult <ScimUser> .Error(ScimStatusCode.Status400BadRequest,
                                                    "Id is required on an update"));
            }

            var existingUser = await userStore.GetById(user.Id);

            if (existingUser == null)
            {
                return(ScimResult <ScimUser> .Error(ScimStatusCode.Status400BadRequest, "Cannot update a user that does not exist"));
            }

            return(ScimResult <ScimUser> .Success(user));
        }
        private IScimResult <ScimUser> HasExpectedSchemas(ScimUser user, string schema)
        {
            if (user.Schemas == null || !user.Schemas.Any())
            {
                return(ScimResult <ScimUser> .Error(ScimStatusCode.Status400BadRequest,
                                                    "Resource doesn't contain any schemas"));
            }

            var hasExpectedSchema = user.Schemas.Contains(schema);

            if (!hasExpectedSchema)
            {
                return(ScimResult <ScimUser> .Error(ScimStatusCode.Status400BadRequest,
                                                    "Resource doesn't contain expected schema"));
            }

            return(ScimResult <ScimUser> .Success(user));
        }
Beispiel #3
0
        public async Task <IScimResult <User> > Add(User resource, IEnumerable <ScimExtensionValue> scimExtensions, string resourceSchema)
        {
            var user = await dbContext.Users.FirstOrDefaultAsync(u => u.UserName == resource.UserName);

            if (user != null)
            {
                return(ScimResult <User> .Error(ScimStatusCode.Status409Conflict,
                                                $"User with the username '{user.UserName}' already exists"));
            }

            var mappedUser = userMapper.ToEntity(resource);

            mappedUser.Id = Guid.NewGuid().ToString();

            dbContext.Users.Add(mappedUser);

            await dbContext.SaveChangesAsync();

            return(ScimResult <User> .Success(userMapper.ToDomain(mappedUser)));
        }
Beispiel #4
0
        public async Task <IScimResult <User> > Update(User resource, IEnumerable <ScimExtensionValue> scimExtensions, string resourceSchema)
        {
            var user = await dbContext.Users.FirstOrDefaultAsync(u => u.Id == resource.Id);

            if (user == null)
            {
                return(ScimResult <User> .Error(ScimStatusCode.Status404NotFound,
                                                $"User doesn't exist"));
            }

            var mappedUser = userMapper.ToEntity(resource);

            //...
            user.UserName = mappedUser.UserName;
            //...

            dbContext.Users.Update(user);

            await dbContext.SaveChangesAsync();

            return(ScimResult <User> .Success(userMapper.ToDomain(user)));
        }
        public Task <IScimResult <ScimUser> > ValidateAdd(string resourceAsString, string schema)
        {
            var user = JsonConvert.DeserializeObject <ScimUser>(resourceAsString);

            var schemaResult = HasExpectedSchemas(user, schema);

            if (schemaResult.Status == ScimResultStatus.Failure)
            {
                return(Task.FromResult(schemaResult));
            }

            if (string.IsNullOrWhiteSpace(user.UserName))
            {
                var error = ScimResult <ScimUser> .Error(ScimStatusCode.Status400BadRequest,
                                                         "Username is required on User");

                return(Task.FromResult(error as IScimResult <ScimUser>));
            }

            var success = ScimResult <ScimUser> .Success(user);

            return(Task.FromResult(success as IScimResult <ScimUser>));
        }