Pramod Singh (C) Ответов: 3

Asp.net core 2.0 - аутентификация файлов cookie


Я реализовал аутентификацию на основе утверждений в asp.net приложение core 2.0. но "
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
возвращайте нулевое время spme не всегда.

Что я уже пробовал:

Автозагрузки.в CS:
services.AddAuthentication("TalesSecurityScheme")
                   .AddCookie("TalesSecurityScheme", options =>
                   {
                       options.AccessDeniedPath = new PathString("/Security/Access");
                       options.Cookie = new CookieBuilder
                       {
                           //Domain = "",
                           HttpOnly = true,
                           Name = ".Tales.Security.Cookie",
                           Path = "/",
                           SameSite = SameSiteMode.Lax,
                           SecurePolicy = CookieSecurePolicy.SameAsRequest
                       };

options.LoginPath = new PathString("/Login/StartPage");
                      options.ReturnUrlParameter = "RequestPath";
                      options.SlidingExpiration = true;
                  });


LoginPage:
// create claims
          List<Claim> claims = new List<Claim>
          {
              new Claim(ClaimTypes.Name, EncrypterDecrypter.Encrypt(loginEntity.UserName)),
              new Claim(ClaimTypes.Email, EncrypterDecrypter.Encrypt(loginEntity.Email)),
              new Claim(ClaimTypes.Role, loginEntity.Role),
              new Claim(ClaimTypes.Gender, EncrypterDecrypter.Encrypt(loginEntity.Gender)),                 new Claim(ClaimTypes.Sid, EncrypterDecrypter.Encrypt(loginEntity.UserId))
          };

          // create identity
          ClaimsIdentity identity = new ClaimsIdentity(claims, "cookie");


          // create principal
          ClaimsPrincipal principal = new ClaimsPrincipal(identity);

          // Set current principal
          Thread.CurrentPrincipal = principal;
          HttpContext.User = principal;

          // sign-in
          await HttpContext.SignInAsync(
                  scheme: "TalesSecurityScheme",
                  principal: principal,
                  properties: new AuthenticationProperties
                  {
                      //IsPersistent = true,
                      ExpiresUtc = DateTime.UtcNow.AddMinutes(_config.Value.CookieTimeout)
                  });


Домой:
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;

          if (identity != null)
          {
              // Get the claims values
              result = identity.Claims.Where(c => c.Type == ClaimTypes.Email)
                             .Select(c => c.Value).SingleOrDefault();
          }


Так что некоторое время возвращая null в
identity 
переменная. Пожалуйста, подскажите, где я делаю что-то не так.

3 Ответов

Рейтинг:
2

Dinesh Singh Kushwaha (Dev)

Вы можете найти свое решение здесь : ASP.NET аутентификация файлов Cookie Core 2.0[^]


Pramod Singh (C)

Да, Динеш, я был реализован из той же ссылки, но некоторое время работал нормально и некоторое время возвращал нулевое значение из потока (ClaimsPrincipal).CurrentPrincipal;

Рейтинг:
2

Dinesh Singh Kushwaha (Dev)

Вы можете найти свой ответ здесь : [^]


CHill60

Знаете ли вы, что вы можете использовать зеленое "решение для улучшения", чтобы добавить больше информации в свой пост? Это лучше, чем публиковать несколько решений одного и того же вопроса, которые могут сбить с толку

Pramod Singh (C)

Да, Динеш, я был реализован из той же ссылки, но некоторое время работал нормально и некоторое время возвращал нулевое значение из потока (ClaimsPrincipal).CurrentPrincipal;

Рейтинг:
11

Ryan Peden

Это похоже на код, в котором вы работаете:

var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;

вероятно, он работает в другом потоке, чем тот, в котором вы сохранили Принципал утверждений.

Вместо этого, попробуйте использовать внедрение зависимостей ASP.NET ядра, чтобы придать IHttpContextAccessor. Тогда вы могли бы сделать что-то вроде этого:

var context = _httpContextAccessor.HttpContext;
var user = context.User;

И как только у вас есть пользователь, вы, конечно, можете получить доступ ко всем заявлениям пользователя и делать с ними все, что вам нужно.


Pramod Singh (C)

Да, но я могу найти только пользователя, и я не могу узнать роль, идентификатор пользователя и другие детали.

Pramod Singh (C)

Спасибо за быструю помощь, теперь работаю ... :)