[Api.HttpPost] //(MatchAllBodyParameters = false)]
 public async static Task <HttpResponseMessage> CreateAsync(
     [Property(Name = AccountPropertyName)] Guid accountId,
     [Property(Name = AuthorizationPropertyName)] IRef <Authorization> authorizationRef,
     [Resource] AccountMapping accountMapping,
     Api.Azure.AzureApplication application, Api.SessionToken security,
     CreatedResponse onCreated,
     ForbiddenResponse onForbidden,
     UnauthorizedResponse onUnauthorized,
     ReferencedDocumentDoesNotExistsResponse <Authorization> onAuthenticationDoesNotExist,
     GeneralConflictResponse onFailure)
 {
     if (!await application.CanAdministerCredentialAsync(accountId, security))
     {
         return(onUnauthorized());
     }
     return(await await authorizationRef.StorageGetAsync(
                async authorization =>
     {
         accountMapping.Method = authorization.Method;     // method is used in the .mappingId
         var authorizationLookup = new AuthorizationLookup
         {
             accountMappingRef = accountMapping.mappingId,
             authorizationLookupRef = authorizationRef,
         };
         return await await authorizationLookup.StorageCreateAsync(
             async(idDiscard) =>
         {
             accountMapping.accountMappingLookup = await await authorization.ParseCredentailParameters(
                 application,
                 (accountKey, loginProvider) =>
             {
                 var lookup = new AccountMappingLookup()
                 {
                     accountkey = accountKey,
                     accountMappingId = accountMapping.mappingId,
                     Method = authorization.Method,
                 };
                 return lookup.StorageCreateAsync(
                     (discard) => new RefOptional <AccountMappingLookup>(
                         lookup.accountMappingLookupId),
                     () => new RefOptional <AccountMappingLookup>());
             },
                 (why) =>
             {
                 var amLookupMaybe = new RefOptional <AccountMappingLookup>();
                 return amLookupMaybe.AsTask();
             });
             return await accountMapping.StorageCreateAsync(
                 createdId =>
             {
                 return onCreated();
             },
                 () => onForbidden().AddReason("Account is already mapped to that authentication."));
         },
             () => onFailure("Authorization is already mapped to another account.").AsTask());
     },
                () => onAuthenticationDoesNotExist().AsTask()));
 }
        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>());
            }
        }
Beispiel #3
0
        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()));
        }