チェンジセット 1597 (default)


以下の違いを無視:
日時:
2023/08/21 14:40:17 (14ヵ月前)
更新者:
hizuya@…
ログメッセージ:
  • フォーム認証関係の機能を整理。
    • メソッド名の統一 (変更)。
    • 中間処理の機能を public に変更し、フォーム認証チケット等にアクセスできるように対応。
ファイル:
1個の更新

凡例:

未変更
追加
削除
  • framework/trunk/WebLibrary/Sources/Security/WebSecurityUtility.cs

    r1541 r1597  
    2424{ 
    2525    using System; 
     26    using System.Diagnostics; 
    2627    using System.Web; 
    27     using System.Web.Configuration; 
    2828    using System.Web.Security; 
    2929    using FCSoft.SilverFrost.Framework.Web.Properties; 
     
    3838        /// フォーム認証のチケットのバージョン。 
    3939        /// </summary> 
    40         private const int FormsAuthenticationTicketVersion = 2; 
    41  
    42         /// <summary> 
    43         /// フォーム認証の設定。 
    44         /// </summary> 
    45         private static readonly FormsAuthenticationConfiguration FormsAuthenticationConfiguration 
    46             = InitializeFormsAuthenticationConfiguration(); 
    47  
    48         /// <summary> 
    49         /// フォーム認証のチケットがタイムアウトする分数。 
    50         /// </summary> 
    51         private static readonly int FormsTicketTimeoutMinutes 
    52             = FormsAuthenticationConfiguration != null 
    53                 ? (int)FormsAuthenticationConfiguration.Timeout.TotalMinutes 
    54                 : 30; 
    55  
    56  
    57         /// <summary> 
    58         /// フォーム認証のクッキーを指定された値を元に書き換えます。 
     40        public static readonly int FormsAuthenticationTicketVersion 
     41            = (new FormsAuthenticationTicket(string.Empty, false, 0)).Version; 
     42 
     43 
     44        /// <summary> 
     45        /// フォーム認証チケットを作成して返します。 
    5946        /// </summary> 
    6047        /// <param name="userName"> 
     
    7158        /// <param name="isPersistent"> 
    7259        /// チケットを、複数のブラウザ セッションにわたって保存される永続的な 
    73         /// <c>Cookie</c> に格納する場合は <see langword="true"/>。 
     60        /// クッキーに格納する場合は <see langword="true"/>。 
    7461        /// 永続的にはしない場合は <see langword="false"/>。 
    7562        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     
    8067        /// </param> 
    8168        /// <param name="cookiePath"> 
    82         /// <c>Cookie</c> に格納される場合のチケットのパス。 
    83         /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
    84         /// </param> 
    85         /// <exception cref="HttpException"> 
    86         /// HTTP Cookie による認証を行うように構成されていないか、 
    87         /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
    88         /// </exception> 
    89         public static void RewriteFormsCookie( 
     69        /// クッキーに格納される場合のチケットのパス。 
     70        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     71        /// </param> 
     72        /// <returns> 
     73        /// フォーム認証チケット。 
     74        /// </returns> 
     75        public static FormsAuthenticationTicket CreateFormsAuthenticationTicket( 
    9076            string userName, 
    9177            DateTime? issueDate, 
     
    9581            string cookiePath) 
    9682        { 
     83            DateTime usedIssueDate = issueDate ?? DateTime.Now; 
     84 
     85            return new FormsAuthenticationTicket( 
     86                FormsAuthenticationTicketVersion, 
     87                userName ?? string.Empty, 
     88                usedIssueDate, 
     89                usedIssueDate.AddMinutes((timeout ?? FormsAuthentication.Timeout).TotalMinutes), 
     90                isPersistent ?? false, 
     91                userData ?? string.Empty, 
     92                cookiePath ?? FormsAuthentication.FormsCookiePath); 
     93        } 
     94 
     95        /// <summary> 
     96        /// フォーム認証用の <see cref="HttpCookie"/> を作成して返します。 
     97        /// </summary> 
     98        /// <param name="name">新しいクッキーの名前。</param> 
     99        /// <param name="value">新しいクッキーの値。</param> 
     100        /// <returns> 
     101        /// フォーム認証用の <see cref="HttpCookie"/>。 
     102        /// </returns> 
     103        /// <exception cref="HttpException"> 
     104        /// HTTP Cookie による認証を行うように構成されていません。 
     105        /// </exception> 
     106        public static HttpCookie CreateFormsAuthenticationCookie(string name, string value) 
     107        { 
     108            HttpCookie cookie = new HttpCookie(name, value); 
     109            SetupFormsAuthenticationCookie(cookie); 
     110            return cookie; 
     111        } 
     112 
     113        /// <summary> 
     114        /// 指定したフォーム認証チケットを含むクッキーを作成して返します。 
     115        /// </summary> 
     116        /// <param name="ticket"> 
     117        /// クッキーに含めるフォーム認証チケット。 
     118        /// </param> 
     119        /// <returns> 
     120        /// <paramref name="ticket"/> を含んだクッキー。 
     121        /// </returns> 
     122        /// <exception cref="HttpException"> 
     123        /// HTTP Cookie による認証を行うように構成されていないか、 
     124        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
     125        /// </exception> 
     126        public static HttpCookie CreateFormsAuthenticationCookie(FormsAuthenticationTicket ticket) 
     127        { 
    97128            if (!FormsAuthentication.CookiesSupported) 
    98129            { 
     
    101132            } 
    102133 
    103             DateTime usedIssueDate = issueDate ?? DateTime.Now; 
    104  
    105             SetFormsCookie( 
    106                 new FormsAuthenticationTicket( 
    107                     FormsAuthenticationTicketVersion, 
    108                     userName ?? string.Empty, 
    109                     usedIssueDate, 
    110                     usedIssueDate.AddMinutes( 
    111                         timeout.HasValue 
    112                             ? timeout.Value.TotalMinutes 
    113                             : FormsTicketTimeoutMinutes), 
    114                     isPersistent ?? false, 
    115                     userData ?? string.Empty, 
    116                     cookiePath ?? FormsAuthentication.FormsCookiePath)); 
    117         } 
    118  
    119  
    120         /// <summary> 
    121         /// フォーム認証のクッキーを指定された値を元に書き換えます。 
     134            string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
     135            if (string.IsNullOrEmpty(encryptedTicket)) 
     136            { 
     137                throw new HttpException( 
     138                    Resources.Http_WebSecurityUtility_UnableToEncryptCookieTicket); 
     139            } 
     140 
     141            string cookieName = FormsAuthentication.FormsCookieName; 
     142            HttpCookie cookie = CreateFormsAuthenticationCookie(cookieName, encryptedTicket); 
     143            cookie.Path = ticket.CookiePath; 
     144 
     145            if (ticket.IsPersistent) 
     146            { 
     147                DateTime expires = DateTime.Now.AddMonths(3); 
     148                cookie.Expires = expires < ticket.Expiration ? ticket.Expiration : expires; 
     149            } 
     150 
     151            return cookie; 
     152        } 
     153 
     154        /// <summary> 
     155        /// 現在の HTTP コンテキストに対して、フォーム認証チケットを含むクッキーを作成して置き換えます。 
     156        /// </summary> 
     157        /// <param name="userName"> 
     158        /// チケットに関連付けられているユーザー名。 
     159        /// </param> 
     160        /// <param name="issueDate"> 
     161        /// チケットが発行されたローカルの日付と時刻。 
     162        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     163        /// </param> 
     164        /// <param name="timeout"> 
     165        /// チケットの有効期限が切れるまでの時間間隔。 
     166        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     167        /// </param> 
     168        /// <param name="isPersistent"> 
     169        /// チケットを、複数のブラウザ セッションにわたって保存される永続的な 
     170        /// クッキーに格納する場合は <see langword="true"/>。 
     171        /// 永続的にはしない場合は <see langword="false"/>。 
     172        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     173        /// チケットが URL に格納される場合には、この値は無視されます。 
     174        /// </param> 
     175        /// <param name="userData"> 
     176        /// チケットに格納されるユーザー固有のデータ。 
     177        /// </param> 
     178        /// <param name="cookiePath"> 
     179        /// クッキーに格納される場合のチケットのパス。 
     180        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     181        /// </param> 
     182        /// <exception cref="HttpException"> 
     183        /// HTTP Cookie による認証を行うように構成されていないか、 
     184        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
     185        /// </exception> 
     186        public static void RewriteFormsAuthenticationCookie( 
     187            string userName, 
     188            DateTime? issueDate, 
     189            TimeSpan? timeout, 
     190            bool? isPersistent, 
     191            string userData, 
     192            string cookiePath) 
     193        { 
     194            if (!FormsAuthentication.CookiesSupported) 
     195            { 
     196                throw new HttpException( 
     197                    Resources.Http_WebSecurityUtility_CookieNotSupported); 
     198            } 
     199 
     200            HttpContext context = HttpContext.Current; 
     201            if (context == null) 
     202            { 
     203                return; 
     204            } 
     205 
     206            RewriteFormsAuthenticationCookie( 
     207                context.Request.Cookies, 
     208                userName, 
     209                issueDate, 
     210                timeout, 
     211                isPersistent, 
     212                userData, 
     213                cookiePath); 
     214        } 
     215 
     216        /// <summary> 
     217        /// 指定されたクッキーコレクションに対して、フォーム認証チケットを含むクッキーを作成して置き換えます。 
     218        /// </summary> 
     219        /// <param name="cookies"> 
     220        /// クッキーコレクション。 
     221        /// </param> 
     222        /// <param name="userName"> 
     223        /// チケットに関連付けられているユーザー名。 
     224        /// </param> 
     225        /// <param name="issueDate"> 
     226        /// チケットが発行されたローカルの日付と時刻。 
     227        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     228        /// </param> 
     229        /// <param name="timeout"> 
     230        /// チケットの有効期限が切れるまでの時間間隔。 
     231        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     232        /// </param> 
     233        /// <param name="isPersistent"> 
     234        /// チケットを、複数のブラウザ セッションにわたって保存される永続的な 
     235        /// クッキーに格納する場合は <see langword="true"/>。 
     236        /// 永続的にはしない場合は <see langword="false"/>。 
     237        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     238        /// チケットが URL に格納される場合には、この値は無視されます。 
     239        /// </param> 
     240        /// <param name="userData"> 
     241        /// チケットに格納されるユーザー固有のデータ。 
     242        /// </param> 
     243        /// <param name="cookiePath"> 
     244        /// クッキーに格納される場合のチケットのパス。 
     245        /// デフォルトを使用する場合は <see langword="null"/> 参照です。 
     246        /// </param> 
     247        /// <exception cref="HttpException"> 
     248        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
     249        /// </exception> 
     250        public static void RewriteFormsAuthenticationCookie( 
     251            HttpCookieCollection cookies, 
     252            string userName, 
     253            DateTime? issueDate, 
     254            TimeSpan? timeout, 
     255            bool? isPersistent, 
     256            string userData, 
     257            string cookiePath) 
     258        { 
     259            SetFormsAuthenticationCookie( 
     260                cookies, 
     261                CreateFormsAuthenticationTicket( 
     262                    userName, 
     263                    issueDate, 
     264                    timeout, 
     265                    isPersistent, 
     266                    userData, 
     267                    cookiePath)); 
     268        } 
     269 
     270 
     271        /// <summary> 
     272        /// 現在の HTTP コンテキストに設定されているフォーム認証チケットとクッキーの期限を、現在の日時を元に延長します。 
    122273        /// </summary> 
    123274        /// <exception cref="HttpException"> 
     
    126277        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
    127278        /// </exception> 
    128         public static void RenewFormsCookieIfOld() 
     279        public static void RenewFormsAuthenticationCookieIfOld() 
    129280        { 
    130281            if (!FormsAuthentication.CookiesSupported) 
     
    134285            } 
    135286 
    136             HttpRequest request = HttpContext.Current.Request; 
    137             HttpCookie cookie = request.Cookies[FormsAuthentication.FormsCookieName]; 
     287            HttpContext context = HttpContext.Current; 
     288            if (context == null) 
     289            { 
     290                return; 
     291            } 
     292 
     293            RenewFormsAuthenticationCookieIfOld(context.Request.Cookies); 
     294        } 
     295 
     296 
     297        /// <summary> 
     298        /// 指定されたクッキーコレクションに設定されているフォーム認証チケットとクッキーの期限を、現在の日時を元に延長します。 
     299        /// </summary> 
     300        /// <param name="cookies"> 
     301        /// クッキーコレクション。 
     302        /// </param> 
     303        /// <exception cref="HttpException"> 
     304        /// フォーム認証のクッキーの値が正しくないか、 
     305        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
     306        /// </exception> 
     307        public static void RenewFormsAuthenticationCookieIfOld(HttpCookieCollection cookies) 
     308        { 
     309            HttpCookie cookie = cookies[FormsAuthentication.FormsCookieName]; 
    138310            if (cookie == null) 
    139311            { 
     
    159331            } 
    160332 
    161             SetFormsCookie(newTicket); 
    162         } 
    163  
    164         /// <summary> 
    165         /// フォーム認証のクッキーを削除します。 
     333            SetFormsAuthenticationCookie(cookies, newTicket); 
     334        } 
     335 
     336        /// <summary> 
     337        /// 現在の HTTP コンテキストから、フォーム認証のクッキーを削除します。 
    166338        /// </summary> 
    167339        /// <exception cref="HttpException"> 
     
    174346        /// メソッドと同じ動きですが、呼び出した後ログインページへのリダイレクトは行われません。 
    175347        /// </remarks> 
    176         public static void RemoveFormsCookie() 
     348        public static void RemoveFormsAuthenticationCookie() 
    177349        { 
    178350            if (!FormsAuthentication.CookiesSupported) 
     
    183355 
    184356            HttpContext context = HttpContext.Current; 
     357            if (context == null) 
     358            { 
     359                return; 
     360            } 
     361 
     362            RemoveFormsAuthenticationCookie(context.Request.Cookies, context.Request.Browser.SupportsEmptyStringInCookieValue); 
     363        } 
     364 
     365        /// <summary> 
     366        /// 指定されたクッキーコレクションから、フォーム認証のクッキーを削除します。 
     367        /// </summary> 
     368        /// <param name="cookies"> 
     369        /// クッキーコレクション。 
     370        /// </param> 
     371        /// <param name="supportsEmptyStringInCookieValue"> 
     372        /// ブラウザがクッキーの値として空文字列をサポートしている場合は <see langword="true"/>。 
     373        /// それ以外の場合は <see langword="false"/>。 
     374        /// </param> 
     375        /// <exception cref="HttpException"> 
     376        /// フォーム認証のクッキーの値が正しくないか、 
     377        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
     378        /// </exception> 
     379        /// <remarks> 
     380        /// <see cref="FormsAuthentication.SignOut() "/> 
     381        /// メソッドと同じ動きですが、呼び出した後ログインページへのリダイレクトは行われません。 
     382        /// </remarks> 
     383        public static void RemoveFormsAuthenticationCookie(HttpCookieCollection cookies, bool supportsEmptyStringInCookieValue) 
     384        { 
    185385            string cookieName = FormsAuthentication.FormsCookieName; 
    186             HttpCookie oldCookie = context.Request.Cookies[cookieName]; 
     386            HttpCookie oldCookie = cookies[cookieName]; 
    187387            if (oldCookie == null) 
    188388            { 
     
    207407 
    208408            string cookieValue 
    209                 = !context.Request.Browser.SupportsEmptyStringInCookieValue 
     409                = !supportsEmptyStringInCookieValue 
    210410                ? "NoCookie" 
    211411                : string.Empty; 
     
    214414            newCookie.Expires = new DateTime(1999, 10, 12); 
    215415 
    216             HttpCookieCollection cookies = context.Response.Cookies; 
    217             cookies.Remove(cookieName); 
    218             cookies.Add(newCookie); 
    219         } 
    220  
    221         /// <summary> 
    222         /// フォーム認証用の <see cref="HttpCookie"/> を作成して返します。 
    223         /// </summary> 
    224         /// <param name="name">新しいクッキーの名前。</param> 
    225         /// <param name="value">新しいクッキーの値。</param> 
    226         /// <returns> 
    227         /// フォーム認証用の <see cref="HttpCookie"/>。 
    228         /// </returns> 
    229         public static HttpCookie CreateFormsAuthenticationCookie(string name, string value) 
    230         { 
    231             HttpCookie cookie = new HttpCookie(name, value); 
    232             SetupFormsAuthenticationCookie(cookie); 
    233             return cookie; 
     416            Debug.Assert(cookieName == newCookie.Name, "Invalid cookie name"); 
     417            SaveCookie(cookies, newCookie); 
    234418        } 
    235419 
     
    258442 
    259443        /// <summary> 
    260         /// フォーム認証の設定を取得します。 
    261         /// </summary> 
    262         /// <returns> 
    263         /// フォーム認証の設定。 
    264         /// 取得できない場合は <see langword="null"/> 参照です。 
    265         /// </returns> 
    266         private static FormsAuthenticationConfiguration InitializeFormsAuthenticationConfiguration() 
    267         { 
    268             SystemWebSectionGroup systemWeb 
    269                 = WebConfigurationManager.OpenWebConfiguration(null).GetSectionGroup("system.web") as SystemWebSectionGroup; 
    270             return systemWeb != null ? systemWeb.Authentication.Forms : null; 
    271         } 
    272  
    273  
    274         /// <summary> 
    275         /// 指定したチケットをクッキーに設定します。 
    276         /// </summary> 
     444        /// 指定したチケットをクッキーコレクションに設定します。 
     445        /// </summary> 
     446        /// <param name="cookies"> 
     447        /// クッキーコレクション。 
     448        /// </param> 
    277449        /// <param name="ticket"> 
    278450        /// 設定するチケット。 
     
    281453        /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 
    282454        /// </exception> 
    283         private static void SetFormsCookie(FormsAuthenticationTicket ticket) 
    284         { 
    285             string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    286             if (string.IsNullOrEmpty(encryptedTicket)) 
    287             { 
    288                 throw new HttpException( 
    289                     Resources.Http_WebSecurityUtility_UnableToEncryptCookieTicket); 
    290             } 
    291  
    292             string cookieName = FormsAuthentication.FormsCookieName; 
    293             HttpCookie cookie = CreateFormsAuthenticationCookie(cookieName, encryptedTicket); 
    294             cookie.Path = ticket.CookiePath; 
    295  
    296             if (ticket.IsPersistent) 
    297             { 
    298                 DateTime expires = DateTime.Now.AddMonths(3); 
    299                 cookie.Expires = expires < ticket.Expiration ? ticket.Expiration : expires; 
    300             } 
    301  
    302             HttpCookieCollection cookies = HttpContext.Current.Response.Cookies; 
     455        private static void SetFormsAuthenticationCookie(HttpCookieCollection cookies, FormsAuthenticationTicket ticket) 
     456        { 
     457            SaveCookie(cookies, CreateFormsAuthenticationCookie(ticket)); 
     458        } 
     459 
     460        /// <summary> 
     461        /// 指定したクッキーをクッキーコレクションに設定します。 
     462        /// </summary> 
     463        /// <param name="cookies"> 
     464        /// クッキーコレクション。 
     465        /// </param> 
     466        /// <param name="cookie"> 
     467        /// 設定するチケット。 
     468        /// </param> 
     469        private static void SaveCookie(HttpCookieCollection cookies, HttpCookie cookie) 
     470        { 
    303471            cookies.Remove(cookie.Name); 
    304472            cookies.Add(cookie); 
詳しい使い方は TracChangeset を参照してください。