ホームページ  >  記事  >  バックエンド開発  >  ASP.NET Core で Cookie ミドルウェアを使用する方法の詳細な紹介

ASP.NET Core で Cookie ミドルウェアを使用する方法の詳細な紹介

黄舟
黄舟オリジナル
2017-05-21 11:13:282107ブラウズ

この記事では主に ASP.NET Core での Cookieミドルウェア の使用方法について詳しく説明します。興味のある方は、http:// で Cookie ミドルウェアを使用する

を参照してください。 ASP.NET Core

ASP.NET Core は、ユーザー サブジェクトを暗号化された Cookie にシリアル化し、後続のリクエストでこの Cookie を検証し、ユーザーを再現して、オブジェクト の User 属性 内の HttpContext に割り当てるための Cookie ミドルウェアを提供します。 。独自のログイン方法とユーザーデータを提供したい場合は、Cookie ミドルウェアを使用して独立した機能を実装できます。

追加して構成する

最初のステップは、Cookie ミドルウェアをアプリケーションに追加することです。まず、nuget を使用して Microsoft.AspNetCore.Authentication.Cookies パッケージを追加します。次に、次のコード行を Startup.cs ファイルの Configure メソッドの app.UseMvc() の前に追加します。

app.UseCookieAuthentication(new CookieAuthenticationOptions()
 {
  AuthenticationScheme = "MyCookieMiddlewareInstance",
  LoginPath = new PathString("/Account/Unauthorized/"),
  AccessDeniedPath = new PathString("/Account/Forbidden/"),
  AutomaticAuthenticate = true,
  AutomaticChallenge = true
 });

上記のコード スニペットは、いくつかのオプションを構成します。

  1. 認証スキーム: これは、ミドルウェアのインスタンスが複数ある場合に、認証を 1 つのインスタンスに制限する場合に使用されます。仕事。

  2. ログインパス: これは、ユーザーがリソースにアクセスしようとしたが認証されなかった場合に、プログラムがリクエストをリダイレクトする相対パスです。

  3. 禁止されたアクセス パス: ユーザーがリソースの認可ポリシーを渡さずにリソースにアクセスしようとすると、リクエストはこの相対パスにリダイレクトされます。

  4. 自動認証: このフラグは、ミドルウェアがリクエストごとに作成するシリアル化された本体を検証して再構築する必要があることを示します。

  5. 自動チャレンジ: このフラグは、ミドルウェア認証が失敗した場合、ブラウザーをログイン パスにリダイレクトするか、アクセス パスを禁止する必要があることを示します。

その他のオプションには、ミドルウェアによって作成されたクレームの発行者の設定、ミドルウェアによって保存される Cookie の名前、Cookie のドメイン、および Cookie のさまざまな セキュリティ 属性が含まれます。デフォルトでは、Cookie ミドルウェアは適切なセキュリティ オプションを使用し、クライアント側で JavaScript によって Cookie が操作されないように HTTPONLY を設定します。リクエストメソッドがHTTPSの場合、CookieのHTTPS動作を制限します。

Cookie を作成する

自分の情報を保存する Cookie を作成するには、Cookie に保存したいユーザー情報をシリアル化して保存するために、ClaimsPrincipal (型) を初期化する必要があります。各メソッド呼び出しには、コントローラー (Controller) 内に適切な ClaimsPrincipal オブジェクトがあります。

コードをコピーします コードは次のとおりです:

await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);

上記のコードは、暗号化された Cookie を作成し、現在のリクエスト応答に追加します。 AuthenticationScheme は、設定中に現在のユーザーを

ログアウト

し、ログインしている Cookie 情報を 削除することを明確に規定しています。コントローラーで次のメソッドを呼び出すことができます。

コードをコピーします コードは次のとおりです:

await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");

バックエンドの変更に応答します

警告

Cookieが作成されると、バックエンドシステムが利用できなくなっても、ミドルウェアはそれを認識せず、Cookie の有効期限が切れるまで常にログインしたままになります。

Cookie 認証ミドルウェアは、オプション クラスで一連の

イベント を提供します。その中の ValidateAsync() イベントは、Cookie 認証の検証方法を中断およびオーバーライドするために使用できます。

バックグラウンド ユーザーのデータベースに「最終変更時刻」列が存在する可能性があることを考慮して、データベースが変更された後に現在の Cookie を無効にするには、まずこの Cookie を作成するときに最終変更ステートメントを追加し、現在の値を含めます。データベース内のデータが変更されると、この値も同時に

更新 されます。

ValidateAsync() のイベント オーバーライドを実装するには、次のシグネチャを持つメソッドを作成する必要があります。

Task ValidateAsync(CookieValidatePrincipalContext context);

ASP.NET Core 認証は、SecurityStamp

Validator でこの検証を実装します。同様の例を次に示します:

public static class LastChangedValidator
 {
  public static async Task ValidateAsync(CookieValidatePrincipalContext context)
  {
   // Pull database from registered DI services.
   var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();
   var userPrincipal = context.Principal;

   // Look for the last changed claim.
   string lastChanged;
   lastChanged = (from c in userPrincipal.Claims
       where c.Type == "LastUpdated"
       select c.Value).FirstOrDefault();

   if (string.IsNullOrEmpty(lastChanged) ||
    !userRepository.ValidateLastChanged(userPrincipal, lastChanged))
   {
    context.RejectPrincipal();
    await context.HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
   }
  }
 }

これらは、Cookie ミドルウェアの構成中に登録する必要があります

app.UseCookieAuthentication(options =>
 {
  options.Events = new CookieAuthenticationEvents
  {
   // Set other options
   OnValidatePrincipal = LastChangedValidator.ValidateAsync
  };
 });

如果你想非破坏性的更新用户主体,例如,name更新了,要想以不影响安全的方式你可以调用 context.ReplacePrincipal() 并且设置 context.ShouldRenew 为 true 。

控制Cookie选项

CookieAuthenticationOptions配备了各种各样的配置选项是你能够很好的调节创建的Cookie。

  1. ClaimsIssuer - 被用来在任何中间件创建的属性之上。(看不懂)

  2. CookieDomain - 如果cookie domain被设置为 ** . http:// contoso.com ** 那么 contoso.com, http://www. contoso.com,staging.contoso.com 等等类似这样的域名也会被允许。

  3. CookieHttpOnly - 这个标志指示这个 cookie 只会被服务端访问。默认值是true,修改这个属性将会开放你的应用造成 Cookie 盗窃,造成跨站脚本的bug。

  4. CookiePath - 这个可以用来隔离运行在同一个 host 下的应用。如果你有一个应用运行在 /app1 上,并且想限制 cookie 限制仅仅被发送给自己,那么你应该设置 CookiePath 属性为 /app1 ;Cookie将会明白只适用于道 /app1 或者他下面的请求。

  5. ExpireTimeSpan - 这个 TimeSpan 时间段之后 Cookie 将会过期。

  6. SlidingExpiration - 这个标志标记了如果超过了过期时间的一半后被访问那么Cookie将会被重置。新的过期时间将会后移到当前时间加上ExpireTimespan之后。当调用 SignInAsync 时可以通过 ** AuthenticationProperties ** 设置绝对的过期时间。通过限制验证cookie有效的时间,绝对期满可以提高应用程序的安全性。

持续性Cookie和绝对过期时间

您可能希望通过浏览器会话使cookie过期。也许你也想通过绝对过期时间和认证来结束cookie,那么你可以在登录认证和创建Cookie时使用HttpContext.Authentication.SignInAsync方法中的AuthenticationProperties参数类实现。AuthenticationProperties类在Microsoft.AspNetCore.Http.Authentication命名空间中。

例如

await HttpContext.Authentication.SignInAsync(
  "MyCookieMiddlewareInstance",
  principal,
  new AuthenticationProperties
  {
   IsPersistent = true
  });

这个代码片段将会实现创建一个认证和相应的Cookie来实现即时浏览器关闭Cookie也能继续保留。任何在cookie属性中的过期时间的设置都将会保存下来。如果浏览器关闭时Cookie也过期了那么在重新启动浏览器是Cookie将会别清理。

await HttpContext.Authentication.SignInAsync(
  "MyCookieMiddlewareInstance",
  principal,
  new AuthenticationProperties
  {
   ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
  });

这段代码将创建一个身份认证和相应的cookie且将持续20分钟。 任何在Cookie options中配置的动态选项都会被忽略。 ExpiresUtc 和 IsPersistent 这两个属性是相互独立的。

其实上面bb了那么多,都没用! 不如来个demo

// 1. 在Startup.cs的Configure方法中加上
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
 AuthenticationScheme = "UserAuth",  // Cookie 验证方案名称,在写cookie时会用到。
 AutomaticAuthenticate = true,     // 是否自动启用验证,如果不启用,则即便客服端传输了Cookie信息,服务端也不会主动解析。除了明确配置了 [Authorize(ActiveAuthenticationSchemes = "上面的方案名")] 属性的地方,才会解析,此功能一般用在需要在同一应用中启用多种验证方案的时候。比如分Area.
 LoginPath = "/User/Index"     // 登录页
});

// 2. 新建UserController
// 3. 创建一个测试登录的方法(这里为了方便测是我用的是get方法,方便传参请求)
public IActionResult Login(int userId, string userName)
{
 WriteUser(userId, userName);
 return Content("Write");
}

private async void WriteUser(int userId, string userName)
{
 var identity = new ClaimsIdentity("Forms");  // 指定身份认证类型
 identity.AddClaim(new Claim(ClaimTypes.Sid, userId.ToString()));  // 用户Id
 identity.AddClaim(new Claim(ClaimTypes.Name, userName));       // 用户名称
 var principal = new ClaimsPrincipal(identity);
 await HttpContext.Authentication.SignInAsync("UserAuth", principal, new AuthenticationProperties { IsPersistent = true , ExpiresUtc = DateTime.UtcNow.AddMinutes(20) }); //过期时间20分钟
}

// 4. 创建一个退出登录的方法
public async Task<ActionResult> Logout()
{
 await HttpContext.Authentication.SignOutAsync("UserAuth"); // Startup.cs中配置的验证方案名
 return RedirectToAction("User", "Index");
}

// 5. 创建一个获取cookie用户信息的方法方便调用
private int GetUserId()
{ 
 //var userName = User.Identity.Name; //获取登录时存储的用户名称
 var userId = User.FindFirst(ClaimTypes.Sid).Value; // 获取登录时存储的Id
 if (string.IsNullOrEmpty(userId))
 {
  return 0;
 }
 else
 {
  return int.Parse(userId);
 }
}
// 或者写一个测试Action
public JsonResult CheckLogin()
{
 var userName = User.Identity.Name; //获取登录时存储的用户名称
 var userId = User.FindFirst(ClaimTypes.Sid).Value; // 获取登录时存储的Id
 return Json({UserId:userId,UserName:userName});
}

// 6. 以上是加密的方式如果直接写好像也是可以的
HttpContext.Response.Cookies.Append("Key", "Value");

以上がASP.NET Core で Cookie ミドルウェアを使用する方法の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。