Хорошо, так что я становлюсь нетерпеливым здесь. :) Я пытаюсь получить доступ к моему авторизованному пользователю через HttpContext.User, обратившись к IHttpContextAccessor, но ни пользователь, ни какие-либо претензии. Здесь используется ядро Dotnet 3.1. В основном, как я это понимаю: войдите в систему с помощью HttpContext.SignInAsync(... а затем контекст доступен через внешние контроллеры IHttpContextAccessor. Теперь контекст доступен, но не могу найти доступную информацию о пользователе из входа. Я делаю видеть, что файлы cookie правильно прикреплены к запросам, но некоторые преобразования не выполняются Кто-нибудь знает, что мне не хватает?
//My controller action:
var claimsIdentity = new ClaimsIdentity("Application");
claimsIdentity.AddClaim(emailClaim);
... more claims
await HttpContext.SignInAsync(
"Application",
new ClaimsPrincipal(claimsIdentity)
);
// Startup.cs:ConfigureServices
services.AddHttpContextAccessor();
// In a MyClass
MyClass(IHttpContextAccessor accessor)
{
accessor.HttpContext.Claims; // Nothing
}
Да частично! Я внедрил MyClass как синглтон, но самая большая проблема была с моей конфигурацией. Спасибо, что нашли время!





Насколько мне известно, если мы использовали аутентификацию с помощью файлов cookie и пользователь уже вошел в систему, мы могли бы получить утверждения от средства доступа httpcontext.
Я предлагаю вам сначала убедиться, что браузер установил токен аутентификации через файл cookie на сервер.
Затем я предлагаю вам убедиться, что вы внедрили myclass как ограниченный, а не Singleton.
Подробнее см. ниже тестовые коды для чтения файла cookie.
Мои занятия:
public class Myclass
{
public IHttpContextAccessor _accessor { get; set; }
public Myclass(IHttpContextAccessor accessor)
{
_accessor = accessor;
var re = accessor.HttpContext.User.Identity as ClaimsIdentity;
int i = 0;
}
public string GetName() {
var re = _accessor.HttpContext.User.Identity as ClaimsIdentity;
string name = re.Claims.First(x => x.Type == "name").Value;
return name;
}
}
Запуск.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddHttpContextAccessor();
services.AddScoped(typeof(Myclass));
}
Использование:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public Myclass test { get; set; }
public HomeController(ILogger<HomeController> logger, Myclass _test)
{
_logger = logger;
test = _test;
}
public async Task<IActionResult> IndexAsync()
{
var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
claimsIdentity.AddClaim(new Claim("name", "aaaa"));
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity)
);
return View();
}
public async Task<IActionResult> PrivacyAsync()
{
var re= test.GetName();
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
Результат:
Спасибо за помощь! Я сделал DInject My Class как singleton, так что это могло быть одной из проблем, но основная проблема заключалась в моей конфигурации.
Итак, похоже, я неправильно настроил аутентификацию с помощью файлов cookie в Google. Возможно, возникла проблема с внедрением MyClass.cs как синглтона, так что на это следует обратить внимание.
Настройка на основе: как реализовать вход через google в ядро .net без провайдера entityframework и https://dotnetthoughts.net/aspnetcore-social-authentication-without-identity/
Это моя рабочая конфигурация:
// Startup.cs:ConfigureServices
services.AddAuthentication(v => {
v.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
v.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(GoogleDefaults.AuthenticationScheme, options =>
{
IConfigurationSection googleAuthNSection =
Configuration.GetSection("Authentication:Google");
options.ClientId = googleAuthNSection["ClientId"];
options.ClientSecret = googleAuthNSection["ClientSecret"];
});
// DIs accessor
services.AddHttpContextAccessor();
// AuthenticationController.cs:MyAction
var authenticateResult = await HttpContext.AuthenticateAsync(GoogleDefaults.AuthenticationScheme);
var claimsIdentity = new ClaimsIdentity("Application");
var surnameClaim = authenticateResult.Principal.FindFirst(ClaimTypes.Surname);
claimsIdentity.AddClaim(surnameClaim);
await HttpContext.SignInAsync(
"Application",
new ClaimsPrincipal(claimsIdentity)
);
return LocalRedirect(returnUrl ?? "~/");
// In MyClass.cs
MyClass(IHttpContextAccessor accessor)
{
accessor.HttpContext.Claims; // Claims available!
}
Любое обновление? Вам поможет мой ответ?