Exemple #1
0
        public static async Task <IHttpResponse> GetAsync(
            [QueryParameter(Name = SessionIdPropertyName, CheckFileName = true)] IRef <Session> sessionRef,
            EastFive.Api.SessionTokenMaybe security,
            IAuthApplication application,
            ContentTypeResponse <Session> onFound,
            NotFoundResponse onNotFound,
            UnauthorizedResponse onUnauthorized,
            ConfigurationFailureResponse onConfigurationFailure)
        {
            if (!IsAnonSessionAllowed())
            {
                if (security.sessionId != sessionRef.id)
                {
                    return(onUnauthorized());
                }
            }
            return(await await sessionRef.StorageGetAsync(
                       (session) =>
            {
                return Web.Configuration.Settings.GetUri(
                    EastFive.Security.AppSettings.TokenScope,
                    scope =>
                {
                    return Web.Configuration.Settings.GetDouble(Security.SessionServer.Configuration.AppSettings.TokenExpirationInMinutes,
                                                                (tokenExpirationInMinutes) =>
                    {
                        return GetClaimsAsync(application, session.authorization,
                                              (claims, accountIdMaybe, authorized) =>
                        {
                            session.account = accountIdMaybe;
                            session.authorized = authorized;
                            return Api.Auth.JwtTools.CreateToken(session.id,
                                                                 scope, TimeSpan.FromMinutes(tokenExpirationInMinutes), claims,
                                                                 (tokenNew) =>
                            {
                                session.token = tokenNew;
                                return onFound(session);
                            },
                                                                 (missingConfig) => onConfigurationFailure("Missing", missingConfig),
                                                                 (configName, issue) => onConfigurationFailure(configName, issue));
                        },
                                              (why) => onNotFound());
                    },
                                                                (why) => onConfigurationFailure("Missing", why).AsTask());
                },
                    (why) => onConfigurationFailure("Missing", why).AsTask());
            },
                       () => onNotFound().AsTask()));

            bool IsAnonSessionAllowed()
            {
                var appType = application.GetType();

                if (!appType.TryGetAttributeInterface <IConfigureAuthorization>(out IConfigureAuthorization authConfig))
                {
                    return(false);
                }
                return(authConfig.IsAnonymousSessionAllowed);
            }
        }
Exemple #2
0
 public static IHttpResponse Get(
     TextResponse onResponse,
     ConfigurationFailureResponse onConfigurationFailure)
 {
     return(EastFive.Azure.AppSettings.Apple.DeveloperSiteAssociation.ConfigurationString(
                (content) =>
     {
         return onResponse(content);
     },
                (why) => onConfigurationFailure(why, why)));
 }
Exemple #3
0
        public override Task <IHttpResponse> InstigateInternal(IApplication httpApp,
                                                               IHttpRequest request, ParameterInfo parameterInfo,
                                                               Func <object, Task <IHttpResponse> > onSuccess)
        {
            ConfigurationFailureResponse responseDelegate =
                (configurationValue, message) =>
            {
                var response = request
                               .CreateResponse(System.Net.HttpStatusCode.ServiceUnavailable)
                               .AddReason($"`{configurationValue}` not specified in config:{message}");

                return(UpdateResponse(parameterInfo, httpApp, request, response));
            };

            return(onSuccess(responseDelegate));
        }
Exemple #4
0
 public static async Task <HttpResponseMessage> GetAsync(
     [QueryParameter(Name = SessionIdPropertyName, CheckFileName = true)] IRef <Session> sessionRef,
     EastFive.Api.SessionToken security,
     Api.Azure.AzureApplication application, UrlHelper urlHelper,
     ContentTypeResponse <Session> onFound,
     NotFoundResponse onNotFound,
     UnauthorizedResponse onUnauthorized,
     ConfigurationFailureResponse onConfigurationFailure)
 {
     if (security.sessionId != sessionRef.id)
     {
         return(onUnauthorized());
     }
     return(await await sessionRef.StorageGetAsync(
                (session) =>
     {
         return Web.Configuration.Settings.GetUri(
             EastFive.Security.AppSettings.TokenScope,
             scope =>
         {
             return Web.Configuration.Settings.GetDouble(Security.SessionServer.Configuration.AppSettings.TokenExpirationInMinutes,
                                                         (tokenExpirationInMinutes) =>
             {
                 return GetClaimsAsync(application, session.authorization,
                                       (claims, accountIdMaybe, authorized) =>
                 {
                     session.account = accountIdMaybe;
                     session.authorized = authorized;
                     return BlackBarLabs.Security.Tokens.JwtTools.CreateToken(session.id,
                                                                              scope, TimeSpan.FromMinutes(tokenExpirationInMinutes), claims,
                                                                              (tokenNew) =>
                     {
                         session.token = tokenNew;
                         return onFound(session);
                     },
                                                                              (missingConfig) => onConfigurationFailure("Missing", missingConfig),
                                                                              (configName, issue) => onConfigurationFailure(configName, issue));
                 },
                                       (why) => onNotFound());
             },
                                                         (why) => onConfigurationFailure("Missing", why).AsTask());
         },
             (why) => onConfigurationFailure("Missing", why).AsTask());
     },
                () => onNotFound().AsTask()));
 }
Exemple #5
0
        [HttpPost] //(MatchAllBodyParameters = false)]
        public async static Task <HttpResponseMessage> CreateAsync(
            [Property(Name = SessionIdPropertyName)] IRef <Session> sessionId,
            [PropertyOptional(Name = AuthorizationPropertyName)] IRefOptional <Authorization> authorizationRefMaybe,
            [Resource] Session session,
            Api.Azure.AzureApplication application,
            CreatedBodyResponse <Session> onCreated,
            AlreadyExistsResponse onAlreadyExists,
            ForbiddenResponse forbidden,
            ConfigurationFailureResponse onConfigurationFailure,
            GeneralConflictResponse onFailure)
        {
            session.refreshToken = Security.SecureGuid.Generate().ToString("N");

            return(await Security.AppSettings.TokenScope.ConfigurationUri(
                       scope =>
            {
                return Security.SessionServer.Configuration.AppSettings.TokenExpirationInMinutes.ConfigurationDouble(
                    async(tokenExpirationInMinutes) =>
                {
                    return await await GetClaimsAsync(application, authorizationRefMaybe,
                                                      (claims, accountIdMaybe, authorized) =>
                    {
                        session.account = accountIdMaybe;
                        session.authorized = authorized;
                        return session.StorageCreateAsync(
                            (sessionIdCreated) =>
                        {
                            return BlackBarLabs.Security.Tokens.JwtTools.CreateToken(sessionId.id,
                                                                                     scope, TimeSpan.FromMinutes(tokenExpirationInMinutes), claims,
                                                                                     (tokenNew) =>
                            {
                                session.token = tokenNew;
                                return onCreated(session);
                            },
                                                                                     (missingConfig) => onConfigurationFailure("Missing", missingConfig),
                                                                                     (configName, issue) => onConfigurationFailure(configName, issue));
                        },
                            () => onAlreadyExists());
                    },
                                                      (why) => onFailure(why).AsTask());
                },
                    (why) => onConfigurationFailure("Missing", why).AsTask());
            },
                       (why) => onConfigurationFailure("Missing", why).AsTask()));
        }
Exemple #6
0
 public static Task <HttpResponseMessage> UpdateBodyAsync(
     [UpdateId(Name = SessionIdPropertyName)] IRef <Session> sessionRef,
     [PropertyOptional(Name = AuthorizationPropertyName)] IRefOptional <Authorization> authorizationRefMaybe,
     Api.Azure.AzureApplication application,
     ContentTypeResponse <Session> onUpdated,
     NotFoundResponse onNotFound,
     ForbiddenResponse forbidden,
     ConfigurationFailureResponse onConfigurationFailure,
     GeneralConflictResponse onFailure)
 {
     return(sessionRef.StorageUpdateAsync(
                (sessionStorage, saveSessionAsync) =>
     {
         return Security.AppSettings.TokenScope.ConfigurationUri(
             scope =>
         {
             return Security.SessionServer.Configuration.AppSettings.TokenExpirationInMinutes.ConfigurationDouble(
                 async(tokenExpirationInMinutes) =>
             {
                 return await await GetClaimsAsync(application, authorizationRefMaybe,
                                                   async(claims, accountIdMaybe, authorized) =>
                 {
                     sessionStorage.authorization = authorizationRefMaybe;
                     sessionStorage.authorized = authorized;
                     sessionStorage.account = accountIdMaybe;
                     return await BlackBarLabs.Security.Tokens.JwtTools.CreateToken(sessionRef.id,
                                                                                    scope, TimeSpan.FromMinutes(tokenExpirationInMinutes), claims,
                                                                                    async(tokenNew) =>
                     {
                         sessionStorage.token = tokenNew;
                         await saveSessionAsync(sessionStorage);
                         return onUpdated(sessionStorage);
                     },
                                                                                    (missingConfig) => onConfigurationFailure("Missing", missingConfig).AsTask(),
                                                                                    (configName, issue) => onConfigurationFailure(configName, issue).AsTask());
                 },
                                                   why => onFailure(why).AsTask());
             },
                 why => onConfigurationFailure("Missing", why).AsTask());
         },
             (why) => onConfigurationFailure("Missing", why).AsTask());
     },
                onNotFound: () => onNotFound()));
 }
Exemple #7
0
 public static Task <HttpResponseMessage> GetByRequestIdAsync(
     [QueryParameter(Name = SessionIdPropertyName, CheckFileName = true)] IRef <Session> sessionRef,
     [QueryParameter(Name = "request_id")] IRef <Authorization> authorization,
     EastFive.Api.SessionToken security,
     Api.Azure.AzureApplication application, UrlHelper urlHelper,
     ContentTypeResponse <Session> onUpdated,
     NotFoundResponse onNotFound,
     ForbiddenResponse forbidden,
     ConfigurationFailureResponse onConfigurationFailure,
     GeneralConflictResponse onFailure)
 {
     return(UpdateBodyAsync(sessionRef, authorization.Optional(),
                            application,
                            onUpdated,
                            onNotFound,
                            forbidden,
                            onConfigurationFailure,
                            onFailure));
 }
 public static IHttpResponse QueryByResourceIdAndTypeAsync(
     [QueryParameter(Name = ResourceTypePropertyName)] Type resourceType,
     [QueryParameter(Name = ResourcePropertyName)] Guid resourceId,
     IApiApplication application,
     RedirectResponse onRedirect,
     UnauthorizedResponse onUnauthorized,
     NotFoundResponse onRedirectNotFound,
     ConfigurationFailureResponse onConfigurationFailure)
 {
     return(AppSettings.SPA.SiteLocation.ConfigurationUri(
                siteUrl =>
     {
         var resourceName = application.GetResourceMime(resourceType);
         var redirectUrl = siteUrl
                           .AppendToPath("redirect")
                           .AddQueryParameter("type", resourceName)
                           .AddQueryParameter("id", resourceId.ToString());
         return onRedirect(redirectUrl);
     },
                (why) => onConfigurationFailure(why, "")));
 }
        public async static Task <HttpResponseMessage> GetAllSecureAsync(
            [QueryParameter(Name = "ApiKeySecurity")] string apiSecurityKey,
            [QueryParameter(Name = "method")] IRef <Method> methodRef,
            [OptionalQueryParameter(Name = "successOnly")] bool successOnly,
            ApiSecurity apiSecurity,
            AzureApplication application,
            HttpRequestMessage request,
            ContentTypeResponse <RedirectionManager[]> onContent,
            UnauthorizedResponse onUnauthorized,
            ConfigurationFailureResponse onConfigFailure)
        {
            Expression <Func <Authorization, bool> > allQuery =
                (authorization) => true;
            var redirections = await allQuery
                               .StorageQuery()
                               .Where(authorization => !authorization.Method.IsDefaultOrNull())
                               .Where(authorization => authorization.Method.id == methodRef.id)
                               .Select <Authorization, Task <RedirectionManager?> >(
                async authorization =>
            {
                RedirectionManager?Failure(string why)
                {
                    if (successOnly)
                    {
                        return(default(RedirectionManager?));
                    }

                    return(new RedirectionManager
                    {
                        authorization = authorization.authorizationRef.Optional(),
                        message = why,
                        when = authorization.lastModified
                    });
                }

                return(await await Method.ById <Task <RedirectionManager?> >(authorization.Method, application,
                                                                             async method =>
                {
                    return await method.ParseTokenAsync(authorization.parameters, application,
                                                        (externalId, loginProvider) =>
                    {
                        return new RedirectionManager
                        {
                            when = authorization.lastModified,
                            message = $"Ready:{externalId}",
                            authorization = authorization.authorizationRef.Optional(),
                            redirection = new Uri(
                                request.RequestUri,
                                $"/api/RedirectionManager?ApiKeySecurity={apiSecurityKey}&authorization={authorization.id}"),
                        };
                    },
                                                        (why) => Failure(why));
                },
                                                                             () => Failure("Method no longer supported").AsTask()));
            })
                               //Parallel()
                               .Throttle()
                               .SelectWhereHasValue()
                               .OrderByDescendingAsync(item => item.when);

            return(onContent(redirections.ToArray()));
        }
        public static Task <HttpResponseMessage> GetRedirection(
            [QueryParameter(Name = "ApiKeySecurity")] string apiSecurityKey,
            [QueryParameter(Name = "authorization")] IRef <Authorization> authRef,
            ApiSecurity apiSecurity,
            AzureApplication application,
            HttpRequestMessage request,
            RedirectResponse onRedirection,
            GeneralFailureResponse onFailure,
            UnauthorizedResponse onUnauthorized,
            ConfigurationFailureResponse onConfigFailure)
        {
            return(authRef.StorageUpdateAsync(
                       async(authorization, saveAsync) =>
            {
                var url = await await Method.ById(authorization.Method, application,
                                                  async method =>
                {
                    return await await method.ParseTokenAsync(authorization.parameters, application,
                                                              async(externalId, loginProvider) =>
                    {
                        var tag = "OpioidTool";
                        return await EastFive.Web.Configuration.Settings.GetString($"AffirmHealth.PDMS.PingRedirect.{tag}.PingAuthName",
                                                                                   async pingAuthName =>
                        {
                            return await EastFive.Web.Configuration.Settings.GetGuid($"AffirmHealth.PDMS.PingRedirect.{tag}.PingReportSetId",
                                                                                     reportSetId =>
                            {
                                var requestParams = authorization.parameters
                                                    .AppendIf("PingAuthName".PairWithValue(pingAuthName), !authorization.parameters.ContainsKey("PingAuthName"))
                                                    .AppendIf("ReportSetId".PairWithValue(reportSetId.ToString()), !authorization.parameters.ContainsKey("ReportSetId"))
                                                    .ToDictionary();

                                return Auth.Redirection.ProcessAsync(authorization,
                                                                     updatedAuth => 1.AsTask(),
                                                                     method, externalId, requestParams,
                                                                     Guid.NewGuid(), request.RequestUri, application, loginProvider,
                                                                     (uri) =>
                                {
                                    return uri;
                                },
                                                                     (why) => default(Uri),
                                                                     application.Telemetry);
                            },
                                                                                     why =>
                            {
                                return default(Uri).AsTask();
                            });
                        },
                                                                                   why =>
                        {
                            return default(Uri).AsTask();
                        });
                    },
                                                              (why) => default(Uri).AsTask());
                },
                                                  () => default(Uri).AsTask());
                if (url.IsDefaultOrNull())
                {
                    return onFailure("Failed to determine correct redirect URL");
                }

                authorization.expired = false;
                await saveAsync(authorization);
                return onRedirection(url);
            }));
        }
Exemple #11
0
        public async static Task <IHttpResponse> GetAllSecureAsync(

            [Api.Meta.Flows.WorkflowParameter(Value = "{{AuthenticationMethod}}")]
            [QueryParameter(Name = "method")]
            IRef <Method> methodRef,

            [OptionalQueryParameter(Name = "successOnly")] bool successOnly,

            [Api.Meta.Flows.WorkflowParameter(Description = "ACP,Dash,TCM,HUDDLE", Value = "")]
            [OptionalQueryParameter(Name = "search")]
            string search,

            [OptionalQueryParameter(Name = "months")] int?monthsMaybe,
            AzureApplication application,
            EastFive.Api.Security security,
            IHttpRequest request,

            [Api.Meta.Flows.WorkflowVariable(AuthorizationPropertyName, "authorization{0}")]
            ContentTypeResponse <RedirectionManager[]> onContent,
            UnauthorizedResponse onUnauthorized,
            ConfigurationFailureResponse onConfigFailure,
            BadRequestResponse onBadRequest)
        {
            // this query is faster than the version commented out below
            var methodMaybe = await Method.ById(methodRef, application, (m) => m, () => default(Method?));

            if (methodMaybe.IsDefault())
            {
                return(onBadRequest().AddReason("Method no longer supported"));
            }
            var method = methodMaybe.Value;

            var months = monthsMaybe.HasValue ? Math.Abs(monthsMaybe.Value) : 1;
            var since  = DateTime.UtcNow.Date.AddMonths(-months);
            var query  = new TableQuery <GenericTableEntity>().Where(
                TableQuery.CombineFilters(
                    TableQuery.GenerateFilterConditionForGuid("method", QueryComparisons.Equal, method.id),
                    TableOperators.And,
                    TableQuery.CombineFilters(
                        TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual, since),
                        TableOperators.And,
                        TableQuery.GenerateFilterConditionForBool("authorized", QueryComparisons.Equal, true)
                        )
                    )
                );
            var table = EastFive.Azure.Persistence.AppSettings.Storage.ConfigurationString(
                (conn) =>
            {
                var account = CloudStorageAccount.Parse(conn);
                var client  = account.CreateCloudTableClient();
                return(client.GetTableReference("authorization"));
            },
                (why) => throw new Exception(why));

            var segment      = default(TableQuerySegment <GenericTableEntity>);
            var token        = default(TableContinuationToken);
            var redirections = new RedirectionManager[] { };

            do
            {
                segment = await table.ExecuteQuerySegmentedAsync(query, token);

                token = segment.ContinuationToken;
                var result = await segment.Results
                             .Select(
                    async (entity) =>
                {
                    var id          = Guid.Parse(entity.RowKey);
                    var when        = entity.Timestamp.DateTime;
                    var props       = entity.WriteEntity(default);
Exemple #12
0
        public async static Task <IHttpResponse> CreateAsync(
            [Api.Meta.Flows.WorkflowNewId]
            [Property(Name = SessionIdPropertyName)]
            IRef <Session> sessionId,

            [Api.Meta.Flows.WorkflowParameter(Value = "{{XAuthorization}}")]
            [PropertyOptional(Name = AuthorizationPropertyName)]
            IRefOptional <Authorization> authorizationRefMaybe,

            [Resource] Session session,
            IAuthApplication application,

            [Api.Meta.Flows.WorkflowVariable2(Workflows.AuthorizationFlow.Variables.AuthHeaderName, HeaderNamePropertyName)]
            [Api.Meta.Flows.WorkflowVariable(Workflows.AuthorizationFlow.Variables.TokenName, TokenPropertyName)]
            CreatedBodyResponse <Session> onCreated,

            AlreadyExistsResponse onAlreadyExists,
            ForbiddenResponse forbidden,
            ConfigurationFailureResponse onConfigurationFailure,
            GeneralConflictResponse onFailure)
        {
            session.refreshToken = Security.SecureGuid.Generate().ToString("N");

            return(await Security.AppSettings.TokenScope.ConfigurationUri(
                       scope =>
            {
                return Security.SessionServer.Configuration.AppSettings.TokenExpirationInMinutes.ConfigurationDouble(
                    async(tokenExpirationInMinutes) =>
                {
                    return await await GetClaimsAsync(application, authorizationRefMaybe,
                                                      (claims, accountIdMaybe, authorized) =>
                    {
                        session.account = accountIdMaybe;
                        session.authorized = authorized;
                        return session.StorageCreateAsync(
                            (sessionIdCreated) =>
                        {
                            return Api.Auth.JwtTools.CreateToken(sessionId.id,
                                                                 scope, TimeSpan.FromMinutes(tokenExpirationInMinutes), claims,
                                                                 (tokenNew) =>
                            {
                                session.token = tokenNew;
                                return onCreated(session);
                            },
                                                                 (missingConfig) => onConfigurationFailure("Missing", missingConfig),
                                                                 (configName, issue) => onConfigurationFailure(configName, issue));
                        },
                            () =>
                        {
                            return Api.Auth.JwtTools.CreateToken(sessionId.id,
                                                                 scope, TimeSpan.FromMinutes(tokenExpirationInMinutes), claims,
                                                                 (tokenNew) =>
                            {
                                session.token = tokenNew;
                                return onCreated(session);
                            },
                                                                 (missingConfig) => onConfigurationFailure("Missing", missingConfig),
                                                                 (configName, issue) => onConfigurationFailure(configName, issue));
                            // onAlreadyExists()
                        });
                    },
                                                      (why) => onFailure(why).AsTask());
                },
                    (why) => onConfigurationFailure("Missing", why).AsTask());
            },
                       (why) => onConfigurationFailure("Missing", why).AsTask()));
        }