Jeer
@Jeer
уверенный пользователь

Почему не работает аутентификация в .net core с ангуляром 5?

Добрый день!
Создал последний шаблон .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 });
  }


5be17c92d3e23878326449.png5be17ca2b19d2708536268.png

Я пробовал разделять проекты и аутентификация у меня заработала после правильной настройки cors. В одном же проекте так ничего и не получается. Где же собака порылась?
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы