-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathSessionFeature.cs
More file actions
159 lines (132 loc) · 5.87 KB
/
Copy pathSessionFeature.cs
File metadata and controls
159 lines (132 loc) · 5.87 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Threading;
using System.Threading.Tasks;
using ServiceStack.Auth;
using ServiceStack.Caching;
using ServiceStack.Text;
using ServiceStack.Web;
namespace ServiceStack
{
public class SessionFeature : IPlugin, Model.IHasStringId
{
public string Id { get; set; } = Plugins.Session;
public const string SessionId = "ss-id";
public const string PermanentSessionId = "ss-pid";
public const string SessionOptionsKey = "ss-opt";
public const string XUserAuthId = HttpHeaders.XUserAuthId;
public static TimeSpan DefaultSessionExpiry = TimeSpan.FromDays(7 * 2); //2 weeks
public static TimeSpan DefaultPermanentSessionExpiry = TimeSpan.FromDays(7 * 4); //4 weeks
public TimeSpan? SessionExpiry { get; set; }
public TimeSpan? SessionBagExpiry { get; set; }
public TimeSpan? PermanentSessionExpiry { get; set; }
private static bool alreadyConfigured;
public void Register(IAppHost appHost)
{
if (alreadyConfigured) return;
alreadyConfigured = true;
//Add permanent and session cookies if not already set.
appHost.GlobalRequestFilters.Add(AddSessionIdToRequestFilter);
}
public static void AddSessionIdToRequestFilter(IRequest req, IResponse res, object requestDto)
{
if (req.PopulateFromRequestIfHasSessionId(requestDto))
return;
if (req.GetTemporarySessionId() == null)
{
res.CreateTemporarySessionId(req);
}
if (req.GetPermanentSessionId() == null)
{
res.CreatePermanentSessionId(req);
}
}
public static string CreateSessionIds(IRequest httpReq = null, IResponse httpRes = null)
{
if (httpReq == null)
httpReq = HostContext.GetCurrentRequest();
if (httpRes == null)
httpRes = httpReq.Response;
return httpRes.CreateSessionIds(httpReq);
}
public static string GetSessionKey(IRequest httpReq = null)
{
var sessionId = httpReq.GetSessionId();
return sessionId == null ? null : GetSessionKey(sessionId);
}
public static string GetSessionKey(string sessionId)
{
return sessionId == null ? null : IdUtils.CreateUrn<IAuthSession>(sessionId);
}
public static T GetOrCreateSession<T>(ICacheClient cache = null, IRequest httpReq = null, IResponse httpRes = null)
{
if (httpReq == null)
httpReq = HostContext.GetCurrentRequest();
var iSession = httpReq.GetSession(reload:false);
if (iSession is T variable)
return variable;
var sessionId = httpReq.GetSessionId();
var sessionKey = GetSessionKey(sessionId);
if (sessionKey != null)
{
var session = (cache ?? httpReq.GetCacheClient()).Get<T>(sessionKey);
if (!Equals(session, default(T)))
return (T)HostContext.AppHost.OnSessionFilter(httpReq, (IAuthSession)session, sessionId);
}
return (T)CreateNewSession(httpReq, sessionId);
}
public static async Task<T> GetOrCreateSessionAsync<T>(ICacheClientAsync cache = null, IRequest httpReq = null, IResponse httpRes = null, CancellationToken token=default)
{
if (httpReq == null)
httpReq = HostContext.GetCurrentRequest();
var iSession = await httpReq.GetSessionAsync(reload:false, token).ConfigAwait();
if (iSession is T variable)
return variable;
var sessionId = httpReq.GetSessionId();
var sessionKey = GetSessionKey(sessionId);
if (sessionKey != null)
{
var session = await (cache ?? httpReq.GetCacheClientAsync()).GetAsync<T>(sessionKey, token).ConfigAwait();
if (!Equals(session, default(T)))
return (T)HostContext.AppHost.OnSessionFilter(httpReq, (IAuthSession)session, sessionId);
}
return (T)CreateNewSession(httpReq, sessionId);
}
/// <summary>
/// Creates a new Session without an Id
/// </summary>
public static IAuthSession CreateNewSession(IRequest httpReq)
{
var session = AuthenticateService.CurrentSessionFactory();
session.CreatedAt = session.LastModified = DateTime.UtcNow;
session.OnCreated(httpReq);
var authEvents = HostContext.TryResolve<IAuthEvents>();
authEvents?.OnCreated(httpReq, session);
return session;
}
/// <summary>
/// Creates a new Session with the specified sessionId otherwise it's populated with a new
/// generated Session Id that's
/// </summary>
public static IAuthSession CreateNewSession(IRequest httpReq, string sessionId)
{
var session = AuthenticateService.CurrentSessionFactory();
session.Id = sessionId ?? CreateSessionIds(httpReq);
session.CreatedAt = session.LastModified = DateTime.UtcNow;
session.OnCreated(httpReq);
var authEvents = HostContext.TryResolve<IAuthEvents>();
authEvents?.OnCreated(httpReq, session);
return session;
}
}
public static class SessionFeatureUtils
{
public static IAuthSession CreateNewSession(this IUserAuth user, IRequest httpReq)
{
var sessionId = SessionExtensions.CreateRandomSessionId();
var newSession = SessionFeature.CreateNewSession(httpReq, sessionId);
var session = HostContext.AppHost.OnSessionFilter(httpReq, newSession, sessionId) ?? newSession;
session.PopulateSession(user);
return session;
}
}
}