Как правильно использовать ISession и session cookie в приложении angular — asp.net.core

#c# #html #angular #asp.net-core #cookies

#c# #HTML #angular #asp.net-core #файлы cookie

Вопрос:

Я занимаюсь созданием веб-приложения с интерфейсом в Angular 7 и серверной частью в ASP.NET.Core 2.1. На стороне сервера я хочу реализовать простую функциональность сеанса. Итак, в Startup.cs я настраиваю сеанс с помощью AddDistributedMemoryCache() , AddSession() и UseSession() . В домене сервера все работает нормально. У меня есть файл cookie сеанса, и у меня есть доступ к сеансу из контроллеров, репозиториев и т. Д. Проблема заключается в том, что я вызываю метод html из другого домена (спереди в Angular). В HtmlRequest нет информации о сеансе cookie, поэтому HttpContext.Session.Id он всегда отличается. Могу ли я отправить значение моего файла cookie на передний план, чтобы создать файл cookie на лицевой стороне с помощью ngx-cookie-service? Затем этот файл cookie будет автоматически отправлен на серверную часть в HtmlRequest. Как я могу получить доступ к этому файлу cookie из серверной части? Я могу получить файл cookie только из запроса, а в запросе от интерфейса нет моего файла cookie. Или обмен My.Cookie между интерфейсом и серверной частью должен происходить автоматически?

На данный момент я создал свое собственное статическое хранилище как одноэлементный сервис, но я думаю, что это должно быть лучшим решением при использовании ISession .

Startup.cs

 public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services
                .AddCors(options =>
                {
                    options.AddPolicy("MyCorsPolicy", policyBuilder =>
                    {
                        policyBuilder
                        .AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowCredentials()
                        .AllowAnyHeader();
                    });
                })
                .AddDistributedMemoryCache()
                .AddSession(options =>
                {
                    options.IdleTimeout = TimeSpan.FromHours(1);
                    options.Cookie = new CookieBuilder { Name = "My.Cookie", HttpOnly = false, IsEssential = true, SameSite = SameSiteMode.None };
                });
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app
                .UseCors("MyCorsPolicy")
                .UseSession()
                .UseMvc(routes =>
                {
                    routes.MapRoute("default",
                        "{controller}/{action}",
                        new { controller = "Home", action = "Index" });
                });
        }
    }
 

FooController.cs

     [Route("api/[controller]")]
    [ApiController]
    public class FooController : ControllerBase
    {
        [HttpGet]
        public IActionResult FooGet()
        {
            return new OkObjectResult(new { message = HttpContext.Session?.GetString("Message") ?? string.Empty, sessionId = HttpContext.Session.Id });
        }

        [HttpPost]
        public IActionResult FooPost(dynamic clientSite)
        {
            string message = clientSite["message"];
            HttpContext.Session.SetString("Message", message);
            return new OkObjectResult(true);
        }
    }
 

rest.server.ts

 import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class RestServer {
  private url = `http://${location.hostname}:60000\api\foo`;

  constructor(private http: HttpClient) { }

  public GetFoo(): Observable<any> {
    return this.http.get(this.url);
  }

  public PostFoo(message: string): Observable<any> {
    return this.http.post(this.url, {message});
  }
}
 

Комментарии:

1. Вы когда-нибудь решали эту проблему?