آئی آئی ایس پر چلنے والی ASP.NET کور ایپلی کیشنز کے لئے سیشن ٹائم آؤٹ میں اضافہ
آپریشن تصدیق کا ماحول
- Visual Studio
-
- Visual Studio 2022
- ASP.NET کور
-
- 8 (ریزر پیجز، ایم وی سی)
- Windows Server
-
- 2022
- IIS
-
- 10.0
آپریٹنگ ماحول
ہم نے تمام معاملات میں اس کی جانچ نہیں کی ہے، لیکن یہ عام طور پر مندرجہ ذیل شرائط کے تحت کام کرنا چاہئے:
- Visual Studio
-
- کوئی بھی چیز جو ایک ASP.NET کور پروجیکٹ تیار کر سکتی ہے
- ASP.NET کور
-
- کسی بھی ورژن (ایم وی سی، ریزر صفحات، اے پی آئی)
- Windows Server
-
- ونڈوز سرور 2008 یا اس کے بعد
- IIS
-
- 7.0 یا اس کے بعد
سب سے پہلے
ASP.NET کور کے ساتھ لکھی گئی ایپلی کیشنز "کیسٹرل" نامی ایک سادہ سرور پر چلتی ہیں ، اور سیشن ٹائم آؤٹ جیسے دورانیے کو بنیادی طور پر پروگرامی طور پر ترتیب دیا جاتا ہے۔
تاہم ، اگر آپ آئی آئی ایس پر ہوسٹنگ کررہے ہیں اور ASP.NET کور ایپلی کیشن چلا رہے ہیں تو ، آپ پروگرامی ترتیب پر آئی آئی ایس میں مقرر کردہ قدر کو اووررائڈ کرنا چاہتے ہیں۔
اس بار بیان کردہ بیکار وقت کی وجہ سے سیشن ٹائم آؤٹ آئی آئی ایس کی ترتیبات سے متاثر ہوتا ہے ، لہذا آئیے اسے سیٹ کرتے ہیں۔ تاہم ، براہ کرم نوٹ کریں کہ سیشن کا وقت متعدد ترتیبات سے متاثر ہوتا ہے ، لہذا ترتیب پر منحصر ہے ، سیشن ٹائم آؤٹ کو صرف اس ترتیب کے ساتھ نہیں بڑھایا جاسکتا ہے۔
یہ ایک ٹیسٹ پروگرام کے ساتھ وضاحت کی گئی ہے، لیکن اگر آپ اسے ترتیب دینے کا ایک فوری طریقہ چاہتے ہیں تو، براہ کرم اس صفحے کے آخر میں چھوڑ دیں.
لاگ ان پروگرام
اس بار ، ہم لاگ ان سیشن میں آپریشن چیک کریں گے۔ آپ دوسرے سیشن استعمال کرسکتے ہیں ، لیکن سیشنوں کے لئے پہلے سے طے شدہ ٹائم آؤٹ سے آگاہ رہیں۔
لاگ ان پروگراموں کے لئے، مندرجہ ذیل تجاویز تقریبا ہمیشہ استعمال کی جاتی ہیں، لہذا براہ کرم تفصیلات کے لئے مندرجہ ذیل کا حوالہ دیں. اس سے کوئی فرق نہیں پڑتا کہ یہ ریزر پیجز یا ایم وی سی ہے۔
یہ ٹپ صرف سیشن ٹائم آؤٹ کے بارے میں ہے ، لہذا میں باقی کوڈ میں نہیں جاؤں گا۔ اپنے پروجیکٹ سے مطابقت رکھنے کے لئے نام کی جگہ میں ترمیم کریں۔
ریزر صفحات پروجیکٹ کوڈ
Program.cs
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
var builder = WebApplication.CreateBuilder(args);
// コンテナにサービスを追加します。
builder.Services.AddRazorPages();
// ※ここから追加
// Cookie による認証スキームを追加する
builder.Services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
builder.Services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての画面、アクションなどに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
// ※ここまで追加
var app = builder.Build();
// HTTP リクエスト パイプラインを構成します。
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// デフォルトの HSTS 値は 30 日です。 運用シナリオではこれを変更することもできます。https://aka.ms/aspnetcore-hsts を参照してください。
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可
app.MapRazorPages();
app.Run();
صفحات/اکاؤنٹ/Login.cshtml.cs
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Security.Claims;
namespace SessionTimeoutExtensionIisRazorPages.Pages
{
[AllowAnonymous]
public class LoginModel : PageModel
{
<summary>ユーザー名。</summary>
[BindProperty]
[Required]
[DisplayName("ユーザー名")]
public string UserName { get; set; } = "";
<summary>パスワード。</summary>
[BindProperty]
[Required]
[DataType(DataType.Password)]
[DisplayName("パスワード")]
public string Password { get; set; } = "";
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
<summary>ログイン処理。</summary>
public async Task<ActionResult> OnPost()
{
// 入力内容にエラーがある場合は処理を中断してエラー表示
if (ModelState.IsValid == false) return Page();
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(UserName, out string? getPass) == false || Password != getPass)
{
ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
return Page();
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, UserName) };
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync(principal);
// ログインが必要な画面にリダイレクトします
return RedirectToPage("/Index");
}
<summary>ログアウト処理。</summary>
public async Task OnGetLogout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}
}
Pages/Account/Login.cshtml
@page
@model LoginModel
@{}
<form asp-action="Login">
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" value="user1" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" value="password1" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<button type="submit" class="btn btn-primary">ログイン</button>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<a asp-page="/Index">認証が必要な画面へ直接リンク</a>
</div>
</div>
</form>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
Pages/Index.cshtml
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<p>アクセス日時:@DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")</p>
Pages/Shared/_Layout.cshtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - SessionTimeoutExtensionIisRazorPages</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/SessionTimeoutExtensionIisRazorPages.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">SessionTimeoutExtensionIisRazorPages</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
@* ここから追加 *@
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/Account/Login" asp-page-handler="Logout">ログアウト</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/Account/Login">ログアウトせずログインへ</a>
</li>
@* ここまで追加 *@
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2024 - SessionTimeoutExtensionIisRazorPages - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
ایم وی سی پروجیکٹ کوڈ
Program.cs
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
var builder = WebApplication.CreateBuilder(args);
// コンテナにサービスを追加します。
builder.Services.AddControllersWithViews();
// ※ここから追加
// Cookie による認証スキームを追加する
builder.Services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
builder.Services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての画面、アクションなどに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
// ※ここまで追加
var app = builder.Build();
// HTTP リクエスト パイプラインを構成します。
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// デフォルトの HSTS 値は 30 日です。 運用シナリオではこれを変更することもできます。https://aka.ms/aspnetcore-hsts を参照してください。
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
ماڈل/ LoginModel.cs
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace SessionTimeoutExtensionIisMvc.Models
{
public class LoginModel
{
<summary>ユーザー名。</summary>
[Required]
[DisplayName("ユーザー名")]
public string UserName { get; set; } = "";
<summary>パスワード。</summary>
[Required]
[DataType(DataType.Password)]
[DisplayName("パスワード")]
public string Password { get; set; } = "";
}
}
کنٹرولرز/ AccountController.cs
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SessionTimeoutExtensionIisMvc.Models;
using System.Security.Claims;
namespace SessionTimeoutExtensionIisMvc.Controllers
{
<remarks>
<see cref="AllowAnonymous"/> 属性は Cookie 認証していなくてもアクセスできる Action (Controller) であることを示す。
</remarks>
[AllowAnonymous]
public class AccountController : Controller
{
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
<summary>ログイン画面を表示します。</summary>
public IActionResult Login() => View();
<summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> Login(LoginModel model)
{
// 入力内容にエラーがある場合は処理を中断してエラー表示
if (ModelState.IsValid == false) return View(model);
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(model.UserName, out string? getPass) == false || model.Password != getPass)
{
ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
return View(model);
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, model.UserName) };
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync(principal);
// ログインが必要な画面にリダイレクトします
return RedirectToAction(nameof(HomeController.Index), "Home");
}
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
}
}
Views/Account/Login.cshtml
@model LoginModel
@{}
<form asp-action="Login">
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" value="user1" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" value="password1" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<button type="submit" class="btn btn-primary">ログイン</button>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<a asp-controller="Home" asp-action="Index">認証が必要な画面へ直接リンク</a>
</div>
</div>
</form>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
Views/Home/Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<p>アクセス日時:@DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")</p>
Views/Shared/_Layout.cshtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - SessionTimeoutExtensionIisMvc</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/SessionTimeoutExtensionIisMvc.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container-fluid">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">SessionTimeoutExtensionIisMvc</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
@* ここから追加 *@
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="Logout">ログアウト</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="Login">ログアウトせずログインへ</a>
</li>
@* ここまで追加 *@
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2024 - SessionTimeoutExtensionIisMvc - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
ڈیبگنگ کے ذریعے آپریشن کی جانچ پڑتال
سائن ان کے طرز عمل کو چیک کریں اور اس بات کو یقینی بنائیں کہ اگر آپ لاگ ان نہیں ہیں تو آپ دوسرے صفحات تک رسائی حاصل نہیں کرسکتے ہیں۔ مقامی طور پر ڈیبگنگ کرتے وقت ٹائم آؤٹ کا وقت آئی آئی ایس پر چلتے وقت سے مختلف ہوتا ہے ، لہذا آپ کو ڈیبگنگ کرتے وقت ٹائم آؤٹ چیک کرنے کی ضرورت نہیں ہے۔
آئی آئی ایس میں پروگراموں کی تعیناتی
IIS مرتب کریں اور اپنے بنائے ہوئے پروگرام کو تعینات کریں۔ آئی آئی ایس کا قیام یہاں احاطہ نہیں کیا گیا ہے کیونکہ یہ بے کار ہوگا۔ تفصیلی وضاحت کے لئے، ذیل میں تجاویز اور دیگر معلومات دیکھیں.
- ونڈوز سرور پر انٹرنیٹ انفارمیشن سروسز (IIS) مرتب کریں
- انٹرنیٹ پر ASP.NET آئی آئی ایس ویب سرور پر ASP.NET کور پروگراموں کو دور سے شائع کریں
آئی آئی ایس پر تعینات درخواستوں کے لئے سیشن ٹائم آؤٹ چیک کرنا
اب تک ، نہ تو پروگرام اور نہ ہی آئی آئی ایس نے سیشن کا ٹائم آؤٹ مقرر کیا ہے ، لہذا ہر چیز کو ڈیفالٹ ہونا چاہئے۔
سب سے پہلے ، لاگ ان کریں اور اسے کم از کم 20 منٹ کے لئے چھوڑ دیں ، اور پھر Index
صفحے اور Privacy
صفحے تک رسائی حاصل کرنے کی کوشش کریں۔
آپ اسے 20 منٹ تک رسائی حاصل کرسکتے ہیں ، لیکن اگر یہ بار بار ہوتا ہے تو ، آپ کو لاگ ان صفحے پر لے جایا جانا چاہئے۔
آئی آئی ایس منیجر میں ٹائم آؤٹ کی مدت میں توسیع
اگر آپ نے اپنے پروگرام میں ٹائم آؤٹ مقرر نہیں کیا ہے تو ، آپ کو اپنی ایپلی کیشن پول کی ترتیبات میں ٹائم آؤٹ کا وقت بڑھانے کے قابل ہونا چاہئے۔
جب آپ IIS منیجر شروع کرتے ہیں تو ، بائیں طرف کے مینو سے ایپلی کیشن پول منتخب کریں۔ وہ ایپلی کیشن پول منتخب کریں جو آپ اپنی سائٹ کو چلانے کے لئے استعمال کر رہے ہیں ، اور پھر دائیں طرف مینو سے اعلی درجے کی ترتیبات منتخب کریں۔
پروسیس ماڈل گروپ میں ، آئیڈل ٹائم آؤٹ (منٹس) نامی ایک آئٹم ہے ، لہذا اسے منٹوں میں کسی بھی وقت سیٹ کریں۔
ترتیب دینے کے بعد ، اوکے بٹن سے تصدیق کریں۔
اس کے بعد، براہ کرم سیشن ٹائم آؤٹ کے آپریشن کو چیک کریں. اگر آپ اسے 60 منٹ پر سیٹ کرتے ہیں تو ، اگر آپ لاگ آؤٹ نہیں ہیں تو یہ کامیاب ہوگا چاہے لاگ ان ہونے کے 50 منٹ بعد بھی صفحہ تبدیل ہوجائے۔
اگرچہ کچھ لوگ سیشن ٹائم آؤٹ کے درمیان وقت کی مقدار کو زیادہ سے زیادہ بڑھانا چاہتے ہیں ، لیکن زیادہ سے زیادہ 29 گھنٹے مقرر کیا جاسکتا ہے۔ یہ اس وقت سے مطابقت رکھتا ہے جب ایپلی کیشن پول کو ری سائیکل کیا جاتا ہے۔ آپ ایپلی کیشن پول کے ری سائیکل ٹائم کو بڑھا کر ٹائم آؤٹ کا وقت بھی بڑھا سکتے ہیں۔ ایک تشویش یہ بھی ہے کہ استعمال شدہ میموری برقرار رہے گی ، لہذا اگر آپ اسے تبدیل کرتے ہیں تو ، براہ کرم اسے آپریشن کے مطابق ایڈجسٹ کریں۔
اس کے علاوہ ، یہاں تک کہ اگر آپ ٹائم آؤٹ سے پہلے بڑی مقدار میں وقت مقرر کرتے ہیں تو ، یہ اکثر اس سے پہلے ہوتا ہے۔ اس کی وجہ یہ ہے کہ ٹائم آؤٹ کی میعاد ختم ہونے سے پہلے ایپلی کیشن پول کو ری سائیکل کیا جاتا ہے ، یا اگر اس تک تھوڑی دیر کے لئے رسائی حاصل نہیں کی گئی ہے تو یہ روک دی گئی حالت میں چلا جاتا ہے۔ اگر آپ اس بات کو یقینی بنانا چاہتے ہیں کہ سیشن کو مخصوص وقت تک برقرار رکھا جائے تو ، آپ کو دیگر اقدامات کرنے کی ضرورت ہے۔