Добрый день!
Создал последний шаблон .net core 2.1 с Ангуляром 5+.
Решил добавить стандартную аутентификацию.
Всё получилось и заработало, но после публикации упорно не работает.
Вот мои исходники (лишнее вырезаю):
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(c => c.AddPolicy("AllowSpecificOrigin", builder =>
{
builder
.AllowCredentials()
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.SlidingExpiration = true;
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.HttpOnly = false;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors("AllowSpecificOrigin");
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
}
Корсы (как и настройки кукисов) я добавлял уже потом, думал, может в них что-то кроется. Но, повторюсь, это один проект, в котором содержится и ангуляровские файлы и апи. То есть, все запросы абсолютно на одном домене.
AccountController.cs
[Route("api/[controller]")]
[ApiController]
public class AccountController : Controller
{
[HttpPost("[action]")]
[AllowAnonymous]
public async Task<IActionResult> LogIn([FromBody] LoginDto model)
{
if (model.Email.ToLower() == "jeer" && model.Password == "123")
{
var claims = new[] { new Claim(ClaimTypes.Name, model.Email),
new Claim(ClaimTypes.Role, "admin") };
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identity));
var usr = new UserDto
{
UserName = model.Email,
Roles = new List<string> { "admin" }
};
return Ok(usr);
}
return Unauthorized();
}
}
Да, я пока не пользуюсь базой, я захардкодил логин/пароль. И это работает (из дебага вижуалстудии).
Далее я пытаюсь накинуть атрибут (фильтр) авторизации на один из методов. И вот проблема в том, что если я запускаю проект из студии по F5, то User.Identity.Name == jeer. А если публикую на хостинг или на свой комп в папку c:/publish и привязываю обычную IIS к этой папке, то ангуляровские файлы запускаются, аутентификация проходит, но после этого User.Identity.Name == null.
PeresmehController.cs
[HttpGet("[action]")]
//[Authorize] // - делает редирект
[EnableCors("AllowSpecificOrigin")]
public async Task<List<string>> List()
{
var kk = User.Identity.Name; // null
// тут вызов базы
return null;
}
Из ангуляра я вызываю стандартными post/get:
public login(model: LoginDto): Observable<UserDto> {
return this.http.post<UserDto>('/api/Account/Login', model, { withCredentials: true });
}
public getList(): Observable<string[]> {
return this.http.get<string[]>('/api/Peresmeh/List', { withCredentials: true });
}
Я пробовал разделять проекты и аутентификация у меня заработала после правильной настройки cors. В одном же проекте так ничего и не получается. Где же собака порылась?