public static async Task <InvocationMessage> InvocationMessageAsync(this IHttpRequest request, int executionLimit = 1) { var invocationMessageRef = Ref <InvocationMessage> .SecureRef(); var referrer = request.TryGetReferer(out Uri refererTmp) ? refererTmp : new Uri(System.Web.HttpUtility.UrlDecode(refererTmp.OriginalString)); var content = await request.ReadContentAsync(); var invocationMessage = new InvocationMessage { invocationRef = invocationMessageRef, headers = request.Headers .Select(hdr => hdr.Key.PairWithValue(hdr.Value.First())) .ToDictionary(), requestUri = new Uri(System.Web.HttpUtility.UrlDecode(request.RequestUri.OriginalString)), referrer = referrer, content = content, invocationMessageSource = GetInvocationMessageSource(), method = request.Method.Method, executionHistory = new KeyValuePair <DateTime, int>[] { }, executionLimit = executionLimit, }; return(invocationMessage); IRefOptional <InvocationMessage> GetInvocationMessageSource() { if (!request.TryGetHeader(InvocationMessage.InvocationMessageSourceHeaderKey, out string invocationMessageSourceStr)) { return(RefOptional <InvocationMessage> .Empty()); } if (!Guid.TryParse(invocationMessageSourceStr, out Guid invocationMessageSource)) { return(RefOptional <InvocationMessage> .Empty()); } return(invocationMessageSource.AsRefOptional <InvocationMessage>()); } }
internal static async Task <TResult> CreateByMethodAndKeyAsync <TResult>(Authorization authorization, string externalAccountKey, Guid internalAccountId, Func <TResult> onCreated, Func <TResult> onAlreadyMapped, bool shouldRemap = false) { var accountMapping = new AccountMapping() { accountId = internalAccountId, }; accountMapping.Method = authorization.Method; // method is used in the .mappingId accountMapping.authorization = authorization.authorizationRef; var authorizationLookup = new AuthorizationLookup { accountMappingRef = accountMapping.mappingId, authorizationLookupRef = authorization.authorizationRef, }; bool created = await authorizationLookup.StorageCreateAsync( (idDiscard) => { return(true); }, () => { // I guess this is cool... return(false); }); var lookup = new AccountMappingLookup() { accountkey = externalAccountKey, accountMappingId = accountMapping.mappingId, Method = authorization.Method, }; accountMapping.accountMappingLookup = await await lookup.StorageCreateAsync( (discard) => lookup.accountMappingLookupId.Optional().AsTask(), async() => { if (!shouldRemap) { return(RefOptional <AccountMappingLookup> .Empty()); } return(await lookup.accountMappingLookupId.StorageCreateOrUpdateAsync( async(created, lookupToUpdate, saveAsync) => { lookupToUpdate.accountMappingId = accountMapping.mappingId; await saveAsync(lookupToUpdate); return lookupToUpdate.accountMappingLookupId.Optional(); })); }); return(await await accountMapping.StorageCreateAsync( createdId => { return onCreated().AsTask(); }, async() => { if (!shouldRemap) { return onAlreadyMapped(); } return await accountMapping.mappingId.StorageCreateOrUpdateAsync( async(created, mapping, saveAsync) => { mapping.accountMappingLookup = accountMapping.accountMappingLookup; mapping.authorization = accountMapping.authorization; await saveAsync(mapping); return onCreated(); }); })); }
public static async Task <IHttpResponse> ProcessRequestAsync( EastFive.Azure.Auth.Method method, IDictionary <string, string> values, IAzureApplication application, IHttpRequest request, IInvokeApplication endpoints, IProvideUrl urlHelper, Func <Uri, Guid?, IHttpResponse> onRedirect, Func <string, IHttpResponse> onAuthorizationnotFound, Func <string, IHttpResponse> onCouldNotConnect, Func <string, IHttpResponse> onFailure) { //var authorizationRequestManager = application.AuthorizationRequestManager; var telemetry = application.Telemetry; telemetry.TrackEvent($"ResponseController.ProcessRequestAsync - Requesting credential manager."); var requestId = Guid.NewGuid(); request.TryGetReferer(out Uri referer); var redirection = new Redirection { webDataRef = requestId.AsRef <Redirection>(), method = method.authenticationId, values = values, redirectedFrom = referer, }; return(await await redirection.StorageCreateAsync( discard => { return EastFive.Azure.AppSettings.Auth.PauseRedirections.ConfigurationBoolean( async pauseRedirections => { if (pauseRedirections) { return request.CreateResponse(System.Net.HttpStatusCode.OK, $"All logins have been paused for this system. Request ID `{requestId}`"); } return await ContinueAsync(); }, why => ContinueAsync(), ContinueAsync); Task <IHttpResponse> ContinueAsync() { var baseUri = request.RequestUri; return AuthenticationAsync( method, values, application, request, endpoints, request.RequestUri, RefOptional <Authorization> .Empty(), (uri, accountIdMaybe, modifier) => { var response = onRedirect(uri, accountIdMaybe); return modifier(response); }, () => onAuthorizationnotFound("Authorization not found"), onCouldNotConnect, onFailure); } }, () => onFailure("GUID NOT UNIQUE").AsTask())); }