/// <summary>
        /// 認証機能を設定する。
        /// </summary>
        /// <param name="services"></param>
        public static void Authentication(this IServiceCollection services, IConfiguration Configuration)
        {
            //コンテキストパスがある場合はCookie名に付与する。(同じブラウザでみた場合に、クッキー値を上書きしあわないように。)
            var contextPathInfo = Configuration.GetContextPathInfo();

            services.AddAuthentication(o =>
            {
                o.DefaultScheme = Startup.AuthScheme;
            })
            .AddCookie(options =>
            {
                options.LoginPath        = new PathString(LoginPageUrl);         //ログインページ
                options.LogoutPath       = new PathString("/view/Login/Logout"); //ログアウトページ
                options.AccessDeniedPath = new PathString("/view/Login/Deny");   //権限が無いページ表示時の処理

                options.Cookie.Name       = $".sample.Auth.{contextPathInfo.NoSlashContextPath}";
                options.SlidingExpiration = true;
                //クッキーの有効期間
                options.ExpireTimeSpan = AuthTimeoutSpan;
                //HttpOnlyなどは、Startup.Configure内で一律で設定している。
                //options.Cookie.HttpOnly = false;
                //options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;

                //未認証時のリダイレクト処理を上書き
                options.Events.OnRedirectToLogin = (context) =>
                {
                    //Ajaxの場合は401コードを返す(Javascript側でログインページにリダイレクト。)
                    if (context.Request.IsApiOrAjaxRequest())
                    {
                        context.Response.Clear();
                        context.Response.StatusCode = StatusCodes.Status401Unauthorized;

                        //ajaxのURLはPOSTなのでそのままリダイレクトすると404になる。
                        //Refererでajaxリクエストの送り元ページのURLを取得する。
                        string returnUrl = context.HttpContext.Request.Headers["Referer"].ToString();        //ログイン後に遷移するURL
                        returnUrl        = WebUtil.ToLocalUri(returnUrl);                                    //ドメイン外のサイトに飛ばないよう、ローカルURL(http://ドメイン部分を除いたURL)に変換

                        string redirectUrl = $"{new PathString(LoginPageUrl)}?{ReturnUrlParam}={returnUrl}"; //?をPathStringのコンストラクタに渡すと%3Fに変換されてしまうので、外側で連結すること。
                        context.Response.Headers.Add("redirecturl", redirectUrl);                            //axiosでヘッダー名を取得すると全て小文字に変換される。ややこしいのでサーバー側も全て小文字にしておく。

                        return(Task.FromResult <object>(null));
                    }

                    //string originalUrl = context.Request.FullUrl();
                    //Ajax以外の場合は通常のログイン画面へのリダイレクト処理。
                    //context.Response.Redirect(new PathString($"{LoginPageUrl}?{ReturnUrlParam}={originalUrl}"));
                    context.Response.Redirect(context.RedirectUri);
                    return(Task.FromResult <object>(null));
                };

                //権限が無い場合の処理
                options.Events.OnRedirectToAccessDenied = (context) =>
                {
                    //Ajaxの場合は403コードを返す(Javascript側で権限ない旨のメッセージを表示。)
                    if (context.Request.IsApiOrAjaxRequest())
                    {
                        context.Response.Clear();
                        context.Response.StatusCode = StatusCodes.Status403Forbidden;
                        return(Task.FromResult <object>(null));
                    }

                    //Ajax以外の場合は通常のログイン画面へのリダイレクト処理。
                    context.Response.Redirect(context.RedirectUri);
                    return(Task.FromResult <object>(null));
                };
            });

            //偽造防止用設定
            services.AddAntiforgery(opt =>
            {
                opt.Cookie.Name = $".sample.Token.{contextPathInfo.NoSlashContextPath}";
                //HttpOnlyなどは、Startup.Configure内で一律で設定している。
                //opt.Cookie.HttpOnly = false;
                //opt.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
            });
        }