チェンジセット 1597 (default)
- 日時:
- 2023/08/21 14:40:17 (14ヵ月前)
- ファイル:
-
- 1個の更新
凡例:
- 未変更
- 追加
- 削除
-
framework/trunk/WebLibrary/Sources/Security/WebSecurityUtility.cs
r1541 r1597 24 24 { 25 25 using System; 26 using System.Diagnostics; 26 27 using System.Web; 27 using System.Web.Configuration;28 28 using System.Web.Security; 29 29 using FCSoft.SilverFrost.Framework.Web.Properties; … … 38 38 /// フォーム認証のチケットのバージョン。 39 39 /// </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 /// フォーム認証チケットを作成して返します。 59 46 /// </summary> 60 47 /// <param name="userName"> … … 71 58 /// <param name="isPersistent"> 72 59 /// チケットを、複数のブラウザ セッションにわたって保存される永続的な 73 /// <c>Cookie</c>に格納する場合は <see langword="true"/>。60 /// クッキーに格納する場合は <see langword="true"/>。 74 61 /// 永続的にはしない場合は <see langword="false"/>。 75 62 /// デフォルトを使用する場合は <see langword="null"/> 参照です。 … … 80 67 /// </param> 81 68 /// <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( 90 76 string userName, 91 77 DateTime? issueDate, … … 95 81 string cookiePath) 96 82 { 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 { 97 128 if (!FormsAuthentication.CookiesSupported) 98 129 { … … 101 132 } 102 133 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 コンテキストに設定されているフォーム認証チケットとクッキーの期限を、現在の日時を元に延長します。 122 273 /// </summary> 123 274 /// <exception cref="HttpException"> … … 126 277 /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 127 278 /// </exception> 128 public static void RenewForms CookieIfOld()279 public static void RenewFormsAuthenticationCookieIfOld() 129 280 { 130 281 if (!FormsAuthentication.CookiesSupported) … … 134 285 } 135 286 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]; 138 310 if (cookie == null) 139 311 { … … 159 331 } 160 332 161 SetForms Cookie(newTicket);162 } 163 164 /// <summary> 165 /// フォーム認証のクッキーを削除します。333 SetFormsAuthenticationCookie(cookies, newTicket); 334 } 335 336 /// <summary> 337 /// 現在の HTTP コンテキストから、フォーム認証のクッキーを削除します。 166 338 /// </summary> 167 339 /// <exception cref="HttpException"> … … 174 346 /// メソッドと同じ動きですが、呼び出した後ログインページへのリダイレクトは行われません。 175 347 /// </remarks> 176 public static void RemoveForms Cookie()348 public static void RemoveFormsAuthenticationCookie() 177 349 { 178 350 if (!FormsAuthentication.CookiesSupported) … … 183 355 184 356 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 { 185 385 string cookieName = FormsAuthentication.FormsCookieName; 186 HttpCookie oldCookie = co ntext.Request.Cookies[cookieName];386 HttpCookie oldCookie = cookies[cookieName]; 187 387 if (oldCookie == null) 188 388 { … … 207 407 208 408 string cookieValue 209 = ! context.Request.Browser.SupportsEmptyStringInCookieValue409 = !supportsEmptyStringInCookieValue 210 410 ? "NoCookie" 211 411 : string.Empty; … … 214 414 newCookie.Expires = new DateTime(1999, 10, 12); 215 415 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); 234 418 } 235 419 … … 258 442 259 443 /// <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> 277 449 /// <param name="ticket"> 278 450 /// 設定するチケット。 … … 281 453 /// 暗号化認証チケットを HTTP Cookie で使用するのに適した形に変換できませんでした。 282 454 /// </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 { 303 471 cookies.Remove(cookie.Name); 304 472 cookies.Add(cookie);
※ 詳しい使い方は
TracChangeset を参照してください。