>백엔드 개발 >C#.Net 튜토리얼 >ASP.NET Core에서 쿠키 미들웨어를 사용하는 방법에 대한 자세한 소개

ASP.NET Core에서 쿠키 미들웨어를 사용하는 방법에 대한 자세한 소개

黄舟
黄舟원래의
2017-05-21 11:13:282166검색

이 글에서는 ASP.NET Core에서 쿠키미들웨어를 사용하는 방법에 대한 자세한 설명을 주로 소개하고 있는데, 이는 어느 정도 참고할만한 가치가 있으며, 관심 있는 친구는

http://ASP.NET Core에서 쿠키 미들웨어 사용

ASP.NET Core는 쿠키 미들웨어 구성 요소를 제공하여 사용자 주제를 암호화된 쿠키를 확인하고 후속 요청에서 이 쿠키를 확인한 후 사용자를 재현하고 이를 HttpContext 객체의 User 속성에 할당합니다. 자신만의 로그인 방법과 사용자 데이터를 제공하려는 경우 쿠키 미들웨어를 사용하여 독립적인 기능을 구현할 수 있습니다.

추가 및 구성

첫 번째 단계는 애플리케이션에 쿠키 미들웨어를 추가하는 것입니다. 먼저 nuget을 사용하여 Microsoft.AspNetCore.Authentication.Cookies 패키지를 추가합니다. 그런 다음 app.UseMvc() 앞에 Startup.cs 파일의 구성 메서드에 다음 코드 줄을 추가합니다.

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

위의 코드 조각은 여러 옵션을 구성합니다.

  1. 인증 방식: 알려진 미들웨어의 인스턴스가 여러 개인 경우 이 옵션은 다음과 같습니다. 인증을 인스턴스로 제한하려는 경우 유용합니다.

  2. 로그인 경로: 사용자가 리소스에 액세스하려고 시도했지만 인증되지 않은 경우 프로그램이 요청을 리디렉션할 상대 경로입니다.

  3. 금지된 액세스 경로: 사용자가 리소스에 대한 인증 정책을 전달하지 않고 리소스에 액세스하려고 하면 요청이 이 상대 경로로 리디렉션됩니다.

  4. 자동 인증: 이 플래그는 미들웨어가 모든 요청에 ​​대해 생성한 직렬화된 본문을 검증하고 재구성해야 함을 나타냅니다.

  5. 자동 도전: 이 플래그는 미들웨어 인증이 실패할 경우 브라우저를 로그인 경로로 리디렉션하거나 액세스 경로를 금지해야 함을 나타냅니다.

기타 옵션에는 미들웨어에 의해 생성된 클레임 발급자 설정, 미들웨어에 의해 저장된 쿠키 이름, 쿠키 도메인 및 다양한 보안 속성 설정이 포함됩니다. 쿠키에. 기본적으로 쿠키 미들웨어는 적절한 보안 옵션을 사용하여 HTTPONLY를 설정하여 클라이언트 측에서 JavaScript에 의해 쿠키가 조작되는 것을 방지합니다. 요청 방법이 HTTPS인 경우 쿠키의 HTTPS 작동을 제한합니다.

쿠키 생성

자신의 정보를 저장하려면 쿠키를 생성해야 합니다. 저장하려는 사용자 정보를 직렬화하여 저장하려면 ClaimsPrincipal(유형)을 초기화해야 합니다. 매력적인 여자. 각 메서드 호출에는 컨트롤러(Controller)에 적절한 ClaimsPrincipal 개체가 있습니다.

코드 복사 코드는 다음과 같습니다.

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

위 코드는 암호화된 쿠키를 생성하여 현재 요청 응답에 추가합니다. AuthenticationScheme에서는 구성 기간 동안 현재 사용자의

로그아웃

로그아웃, 삭제로그인을 명시적으로 규정하고 있습니다. 쿠키 정보를 확인하려면 컨트롤러에서 다음 메서드를 호출할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

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

백엔드 변경에 대한 응답

경고

일단 쿠키가 생성되면 백엔드 시스템을 더 이상 사용할 수 없더라도 미들웨어는 이를 인식하지 못하고 쿠키가 만료될 때까지 로그인 상태를 유지합니다.

쿠키 인증 미들웨어는 옵션 클래스에서 일련의 이벤트를 제공하며, 그중 ValidateAsync() 이벤트를 사용하여 쿠키를 중단하고 다시 작성할 수 있습니다. 방법.

백그라운드 사용자의 데이터베이스에 '마지막 수정 시간' 열이 있을 수 있다는 점을 고려하여, 데이터베이스 수정 후 현재 쿠키를 무효화하기 위해 먼저 이 쿠키를 생성할 때 마지막 수정 문을 추가하고 포함합니다. 현재 값. 데이터베이스의 데이터가 변경되면 이 값도 동시에 업데이트됩니다.

ValidateAsync()의 이벤트 재정의를 구현하려면 다음 서명을 사용하여 메서드를 작성해야 합니다.

Task ValidateAsync(CookieValidatePrincipalContext context);

ASP.NET Core 인증은 SecurityStampValidator에서 이 유효성 검사를 구현합니다. 비슷한 예는 다음과 같습니다.

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");
   }
  }
 }

쿠키 미들웨어 구성 중에 등록해야 합니다

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에서 쿠키 미들웨어를 사용하는 방법에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.