예제 #1
0
        //public static void Initilize(SimpleInjector.Container container)
        //{
        //    transactionScopeBuilder = container.GetInstance<ITransactionScopeBuilder>();
        //}


        //public static TResult DoAuthorize<TResult>(
        //    this IAuthorizationProcessor authorizationProcess,
        //    string sessionKey,
        //    Func<ITransactionScopeBuilder, TResult> @do,
        //    ILogger logger,
        //    [CallerMemberName]string caller = "")
        //    where TResult : class, IProcessResult, new()
        //{
        //    var authResult = authorizationProcess.Authorize(sessionKey);
        //    if (!authResult.Item1.Result)
        //    {
        //        var result = new TResult();
        //        result.ProcessResult = authResult.Item1;
        //        return result;
        //    }

        //    //var builder = new Data.TransactionScopeBuilder()
        //    //    .Timeout(transactionTimeout);
        //    try
        //    {
        //        return @do(transactionScopeBuilder);
        //    }
        //    catch (Exception ex)
        //    {
        //        logger?.Error($"{caller} error", ex: ex, sessionKey: sessionKey);
        //        return CreateErrorResult<TResult>(ex);
        //    }
        //}

        //public static TResult DoAuthorize<TResult>(
        //        this IAuthorizationProcessor authorizationProcess,
        //        string sessionKey,
        //        Func<TResult> @do,
        //        ILogger logger,
        //        [CallerMemberName]string caller = "")
        //    where TResult : class, IProcessResult, new()
        //{
        //    var authResult = authorizationProcess.Authorize(sessionKey);
        //    if (!authResult.Item1.Result)
        //    {
        //        var result = new TResult();
        //        result.ProcessResult = authResult.Item1;
        //        return result;
        //    }

        //    try
        //    {
        //        return @do();
        //    }
        //    catch (Exception ex)
        //    {
        //        logger?.Error($"{caller} error", ex: ex, sessionKey: sessionKey);
        //        return CreateErrorResult<TResult>(ex);
        //    }
        //}

        /// ※ WCF Web Service 上で TransactionScope を 取り扱わない
        /// Web.Common 上に ビジネスロジックを 寄せる関係上、
        /// 複数テーブル更新を行うかどうかは、Web.Common が一番熟知していなければいけない
        ///// <summary>
        ///// WCF Web Srevice を 非同期で実装するための method wrapper 複数テーブルのレコードを更新する場合に利用
        ///// connectionId は nullableのため、logger の後に配置
        ///// 指定漏れに注意すること
        ///// </summary>
        ///// <typeparam name="TResult"></typeparam>
        ///// <param name="authorizationProcessor"></param>
        ///// <param name="sessionKey"></param>
        ///// <param name="do"></param>
        ///// <param name="logger"></param>
        ///// <param name="connectionId"></param>
        ///// <param name="caller"></param>
        ///// <returns></returns>
        //[Obsolete] public static async Task<TResult> DoAuthorizeAsync<TResult>(
        //    this IAuthorizationProcessor autohrizationProcessor,
        //    string sessionKey,
        //    Func<ITransactionScopeBuilder, CancellationToken, Task<TResult>> @do,
        //    ILogger logger,
        //    string connectionId = null,
        //    [CallerMemberName]string caller = "")
        //    where TResult : class, IProcessResult, new()
        //{
        //    var authResult = await autohrizationProcessor.AuthorizeAsync(sessionKey);
        //    if (!authResult.Item1.Result)
        //    {
        //        var result = new TResult();
        //        result.ProcessResult = authResult.Item1;
        //        return result;
        //    }

        //    //var builder = new TransactionScopeBuilder().Timeout(transactionTimeout);
        //    try
        //    {
        //        var source = CreateCencellationTokenSource();
        //        Hubs.ProgressHub.AddCancellationTokenSource(connectionId, source);
        //        return await @do(transactionScopeBuilder, source.Token);
        //    }
        //    catch (Exception ex)
        //    {
        //        if (!ex.HasCancelledException()
        //         && !ex.IsOperationCanceledException())
        //            logger?.Error($"{caller} error", ex: ex, sessionKey: sessionKey);

        //        return CreateErrorResult<TResult>(ex);
        //    }
        //    finally
        //    {
        //        Hubs.ProgressHub.RemoveCancellationTokenSource(connectionId);
        //    }
        //}

        /// <summary>
        /// WCF Web Srevice を 非同期で実装するための method wrapper
        /// connectionId は nullableのため、logger の後に配置
        /// 指定漏れに注意すること
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="authorizationProcessor"></param>
        /// <param name="sessionKey"></param>
        /// <param name="do"></param>
        /// <param name="logger"></param>
        /// <param name="connectionId"></param>
        /// <param name="caller"></param>
        /// <returns></returns>
        public static async Task <TResult> DoAuthorizeAsync <TResult>(
            this IAuthorizationProcessor authorizationProcessor,
            string sessionKey,
            Func <CancellationToken, Task <TResult> > @do,
            ILogger logger,
            string connectionId = null,
            [CallerMemberName] string caller = "")
            where TResult : class, IProcessResult, new()
        {
            var authResult = await authorizationProcessor.AuthorizeAsync(sessionKey);

            if (!authResult.Item1.Result)
            {
                var result = new TResult();
                result.ProcessResult = authResult.Item1;
                return(result);
            }
            try
            {
                var source = CreateCencellationTokenSource();
                Hubs.ProgressHub.AddCancellationTokenSource(connectionId, source);
                return(await @do(source.Token));
            }
            catch (Exception ex)
            {
                if (!ex.HasCancelledException() &&
                    !ex.IsOperationCanceledException())
                {
                    logger?.Error($"{caller} error", ex: ex, sessionKey: sessionKey);
                }
                return(CreateErrorResult <TResult>(ex));
            }
            finally
            {
                Hubs.ProgressHub.RemoveCancellationTokenSource(connectionId);
            }
        }
예제 #2
0
        /// <summary>認可処理の実態</summary>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var skip = context.ActionDescriptor
                       .FilterDescriptors.Any(x => x.Filter.GetType() == typeof(SkipAuthorizationFilterAttribute));

            if (!skip)
            {
                var dic   = context.HttpContext.GetRequestHeaders(new[] { VOneAccessTokenKey });
                var token = "";
                dic.TryGetValue(VOneAccessTokenKey, out token);

                var result = await authorizationProcessor.AuthorizeAsync(token);

                if (!result.Item1.Result)
                {
                    context.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
                    var json = ConvertToJson(result.Item1);
                    await context.HttpContext.Response.WriteAsync(json);

                    return;
                }
            }
            await next.Invoke();
        }