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