-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
WorkContext.cs
101 lines (88 loc) · 3.42 KB
/
WorkContext.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using SimplCommerce.Infrastructure.Data;
using SimplCommerce.Infrastructure;
using SimplCommerce.Module.Core.Models;
using Microsoft.Extensions.Configuration;
namespace SimplCommerce.Module.Core.Extensions
{
public class WorkContext : IWorkContext
{
private const string UserGuidCookiesName = "SimplUserGuid";
private const long GuestRoleId = 3;
private User _currentUser;
private UserManager<User> _userManager;
private HttpContext _httpContext;
private IRepository<User> _userRepository;
private readonly IConfiguration _configuration;
public WorkContext(UserManager<User> userManager,
IHttpContextAccessor contextAccessor,
IRepository<User> userRepository,
IConfiguration configuration)
{
_userManager = userManager;
_httpContext = contextAccessor.HttpContext;
_userRepository = userRepository;
_configuration = configuration;
}
public string GetCurrentHostName() => _httpContext.Request.Host.Value;
public async Task<User> GetCurrentUser()
{
if (_currentUser != null)
{
return _currentUser;
}
var contextUser = _httpContext.User;
_currentUser = await _userManager.GetUserAsync(contextUser);
if (_currentUser != null)
{
return _currentUser;
}
var userGuid = GetUserGuidFromCookies();
if (userGuid.HasValue)
{
_currentUser = _userRepository.Query().Include(x => x.Roles).FirstOrDefault(x => x.UserGuid == userGuid);
}
if (_currentUser != null && _currentUser.Roles.Count == 1 && _currentUser.Roles.First().RoleId == GuestRoleId)
{
return _currentUser;
}
userGuid = Guid.NewGuid();
var dummyEmail = string.Format("{0}@guest.simplcommerce.com", userGuid);
_currentUser = new User
{
FullName = "Guest",
UserGuid = userGuid.Value,
Email = dummyEmail,
UserName = dummyEmail,
Culture = _configuration.GetValue<string>("Global.DefaultCultureUI") ?? GlobalConfiguration.DefaultCulture
};
var abc = await _userManager.CreateAsync(_currentUser, "1qazZAQ!");
await _userManager.AddToRoleAsync(_currentUser, "guest");
SetUserGuidCookies();
return _currentUser;
}
private Guid? GetUserGuidFromCookies()
{
if (_httpContext.Request.Cookies.ContainsKey(UserGuidCookiesName))
{
return Guid.Parse(_httpContext.Request.Cookies[UserGuidCookiesName]);
}
return null;
}
private void SetUserGuidCookies()
{
_httpContext.Response.Cookies.Append(UserGuidCookiesName, _currentUser.UserGuid.ToString(), new CookieOptions
{
Expires = DateTime.UtcNow.AddYears(5),
HttpOnly = true,
IsEssential = true,
SameSite = SameSiteMode.Strict
});
}
}
}