Beispiel #1
0
        private async Task <AuthenticateResult> GetResult(Func <AccountConfiguration, bool> predicate)
        {
            var accountsResult = await _storage.GetGlobal()
                                 .AndThenAsync(async global =>
            {
                var accounts = new List <AccountConfiguration>();

                accounts.AddRange(global.Accounts.Where(predicate));

                if (Request.RouteValues.TryGetValue("galleryName", out var routeValue))
                {
                    var localResult = await Name.FromString(routeValue.ToString())
                                      .AndThenAsync(name => _storage.Get(name));

                    localResult.IfSuccess(config => accounts.AddRange(config.Accounts.Where(predicate)));
                }

                return(Result.Success <List <AccountConfiguration>, Error>(accounts));
            });

            return(accountsResult.Match(
                       accounts =>
            {
                if (accounts.Count == 0)
                {
                    return AuthenticateResult.NoResult();
                }

                var claims = new List <Claim> {
                    new Claim(ClaimTypes.Name, accounts.First().Name.ToString())
                };
                claims.AddRange(accounts.SelectMany(a => a.Permissions).Distinct().Select(p => new Claim(PermissionRequirement.ClaimType, p.ToString())));

                var identity = new ClaimsIdentity(claims, Scheme.Name);
                var principal = new ClaimsPrincipal(identity);
                var ticket = new AuthenticationTicket(principal, Scheme.Name);
                return AuthenticateResult.Success(ticket);
            },
                       error => AuthenticateResult.Fail(error.Message.UnwrapOr(() => error.Code.ToString()))));
        }
        public async Task <Result <Contracts.SecurityConfiguration, Contracts.Error> > GetAsync(string galleryName)
        {
            var config = await Name.FromString(galleryName).AndThenAsync(name => _storage.Get(name));

            return(config.Map(ToModel, ErrorExtensions.ToContract));
        }