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