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