.Net Core 2 API Как получить текущего зарегистрированного пользователя?
В данный момент эта проблема меня очень сильно волнует. Никогда не было проблем в Web API 2, сейчас в Core, я не могу получить текущие утверждения или идентификационные данные для пользователя, который вошел в систему.
Когда приложение запускается, вызывается Index() IActionResult, и пользователь входит в систему с помощью метода SignInAsync().
public async Task<IActionResult> Index()
{
var claims = new List<Claim>()
{
new Claim(ClaimTypes.Name, "CA19207"),
new Claim(ClaimTypes.Actor, "2770"),
new Claim(ClaimTypes.DateOfBirth, "User")
};
var identity = new ClaimsIdentity(claims, "TNEVP");
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
var isIn = principal.Identity.IsAuthenticated;//returns true
var isAuthed = (HttpContext.User.Identity as ClaimsIdentity).IsAuthenticated;//returns false
return Ok();
}
Затем из службы Angular 2 я звоню api/user, чтобы получить претензии для вошедшего в систему пользователя. Однако набор претензий пуст, а пользователь не аутентифицирован.
[HttpGet("claims")]
public async Task<IEnumerable<Claim>> Get()
{
var claims = (User as ClaimsPrincipal).Claims;
return await Task.FromResult(claims);
}
Разметка в классе Startup является базовой:
public void ConfigureServices(IServiceCollection services)
{
services
.AddAuthentication(o =>
{
o.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(o =>
{
o.LoginPath = "/api/login";
o.LogoutPath = "/api/logout";
// additional config options here
});
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
});
}
Так чего мне здесь не хватает? Это должна быть простая реализация для создания заявок и их последующего обслуживания через вызов API. Спасибо!~
ОБНОВЛЕНИЕ У меня сейчас это работает в Core 1.1, заняло около 30 минут. Я хотел бы знать, что я делаю неправильно в Core 2.
Вот код: Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddAuthorization();
services.AddAuthentication(options =>
{
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "Cookies",
AutomaticAuthenticate = true,
CookieName = "MyCookie",
AutomaticChallenge = true,
LoginPath = "/Home/Login"
});
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
HomeController.cs
public async Task<IActionResult> SignIn()
{
var claims = new List<Claim>()
{
new Claim(ClaimTypes.Name, "Robert Lee"),
new Claim(ClaimTypes.NameIdentifier, "CA2770"),
new Claim(ClaimTypes.DateOfBirth, "8-8-2018")
};
var userIdentity = new ClaimsIdentity(claims, "SessionClaim");
var userPrincipal = new ClaimsPrincipal(userIdentity);
await HttpContext.Authentication.SignInAsync
(CookieAuthenticationDefaults.AuthenticationScheme,
userPrincipal,
new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
IsPersistent = false,
AllowRefresh = false
});
return View();
}
SessionController.cs
[HttpGet("claims", Name = "GetClaims")]
public async Task<IEnumerable<Claim>> GetClaims()
{
var user = (User as ClaimsPrincipal);
var claims = user.Claims;
var isAuthed = user.Identity.IsAuthenticated;
return await Task.FromResult(claims);
}