Skip to content

Commit d66fa18

Browse files
Incorporate CSRF token handling into the GAM security provider.
1 parent c116699 commit d66fa18

File tree

4 files changed

+53
-8
lines changed

4 files changed

+53
-8
lines changed

dotnet/src/dotnetframework/GxClasses/Helpers/HttpHelper.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class HttpHeader
5050
public static string XGXFILENAME = "x-gx-filename";
5151
internal static string ACCEPT = "Accept";
5252
internal static string TRANSFER_ENCODING = "Transfer-Encoding";
53+
internal static string X_GXCSRF_TOKEN= "X-GXCSRF-TOKEN":
5354
}
5455
internal class HttpHeaderValue
5556
{
@@ -91,6 +92,7 @@ public class HttpHelper
9192
const string GAM_CODE_OTP_USER_ACCESS_CODE_SENT = "400";
9293
const string GAM_CODE_TFA_USER_MUST_VALIDATE = "410";
9394
const string GAM_CODE_TOKEN_EXPIRED = "103";
95+
const string GAM_CODE_CSRF_INVALID_TOKEN = "550";
9496
static Regex CapitalsToTitle = new Regex(@"(?<=[A-Z])(?=[A-Z][a-z]) | (?<=[^A-Z])(?=[A-Z]) | (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);
9597

9698
const string CORS_MAX_AGE_SECONDS = "86400";
@@ -252,6 +254,10 @@ private static HttpStatusCode GamCodeToHttpStatus(string code, HttpStatusCode de
252254
{
253255
return HttpStatusCode.Forbidden;
254256
}
257+
else if (code == GAM_CODE_CSRF_INVALID_TOKEN)
258+
{
259+
return HttpStatusCode.BadRequest;
260+
}
255261
return defaultCode;
256262
}
257263
private static void SetJsonError(HttpContext httpContext, string statusCode, string statusDescription)

dotnet/src/dotnetframework/GxClasses/Security/GxSecurityProvider.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public class OutData : Dictionary<string, object>
2020
public interface ISecurityProvider
2121
{
2222
GxResult checkaccesstoken(IGxContext context, String token, out bool isOK);
23+
GxResult checkaccesstoken(IGxContext context, bool useCSRF_Token, out string CSRF_Token, out bool isOK);
2324
GxResult checkaccesstokenprm(IGxContext context, String token, String permissionPrefix, out bool sessionOk, out bool permissionOk);
25+
GxResult checkaccesstokenprm(IGxContext context, bool useCSRF_Token, string permissionName, out string CSRF_Token, out bool sessionOk, out bool permission);
2426
void checksession(IGxContext context, string CleanAbsoluteUri, out bool isOK);
2527
void checksessionprm(IGxContext context, string pathAndQuery, String permissionPrefix, out bool isOK, out bool isPermissionOK);
2628
GxResult refreshtoken(IGxContext context, String clientId, String clientSecret, String refreshToken, out OutData outData, out bool flag);
@@ -88,14 +90,25 @@ public GxResult checkaccesstoken(IGxContext context, string token, out bool isOK
8890
isOK = false;
8991
return new GxResult();
9092
}
91-
93+
public GxResult checkaccesstoken(IGxContext context, bool useCSRF_Token, out string CSRF_Token, out bool isOK)
94+
{
95+
isOK = false;
96+
CSRF_Token = string.Empty;
97+
return new GxResult();
98+
}
9299
public GxResult checkaccesstokenprm(IGxContext context, string token, string permissionPrefix, out bool sessionOk, out bool permissionOk)
93100
{
94101
permissionOk = false;
95102
sessionOk = true;
96103
return new GxResult();
97104
}
98-
105+
public GxResult checkaccesstokenprm(IGxContext context, bool useCSRF_Token, string permissionName, out string CSRF_Token, out bool sessionOk, out bool permission)
106+
{
107+
sessionOk = false;
108+
permission = false;
109+
CSRF_Token = string.Empty;
110+
return new GxResult();
111+
}
99112
public void checksession(IGxContext context, string CleanAbsoluteUri, out bool isOK)
100113
{
101114
isOK = false;

dotnet/src/dotnetframework/GxClasses/Services/GXRestServices.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,23 +450,37 @@ private bool IsAuthenticated(GAMSecurityLevel objIntegratedSecurityLevel, bool o
450450
else
451451
{
452452

453-
token = token.Replace("OAuth ", "");
453+
string CSRFToken;
454+
bool useCSRFToken = false;
454455
if (objIntegratedSecurityLevel == GAMSecurityLevel.SecurityLow)
455456
{
456457
bool isOK;
457-
GxResult result = GxSecurityProvider.Provider.checkaccesstoken(context, token, out isOK);
458+
if (Config.GetValueOf("CSRFToken", out string useCSRFTokenStr) && bool.TryParse(useCSRFTokenStr, out bool useCSRFTokenValue))
459+
{
460+
useCSRFToken = useCSRFTokenValue;
461+
}
462+
GxResult result = GxSecurityProvider.Provider.checkaccesstoken(context, useCSRFToken, out CSRFToken, out isOK);
458463
if (!isOK)
459464
{
460465
HttpHelper.SetGamError(httpContext, result.Code, result.Description);
461466
return false;
462467
}
468+
else
469+
{
470+
if (!string.IsNullOrEmpty(CSRFToken))
471+
AddHeader(HttpHeader.X_GXCSRF_TOKEN, CSRFToken);
472+
}
473+
463474
}
464475
else if (objIntegratedSecurityLevel == GAMSecurityLevel.SecurityHigh)
465476
{
466477
bool sessionOk, permissionOk;
467-
GxResult result = GxSecurityProvider.Provider.checkaccesstokenprm(context, token, objPermissionPrefix, out sessionOk, out permissionOk);
478+
GxResult result = GxSecurityProvider.Provider.checkaccesstokenprm(context, useCSRFToken, objPermissionPrefix, out CSRFToken, out sessionOk, out permissionOk);
468479
if (permissionOk)
469480
{
481+
if (!string.IsNullOrEmpty(CSRFToken))
482+
AddHeader(HttpHeader.X_GXCSRF_TOKEN, CSRFToken);
483+
470484
return true;
471485
}
472486
else

dotnet/src/dotnetframework/GxClasses/Services/GxRestWrapper.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,24 +567,36 @@ protected bool IsAuthenticated(GAMSecurityLevel objIntegratedSecurityLevel, bool
567567
}
568568
else
569569
{
570-
570+
string CSRFToken;
571+
bool useCSRFToken = false;
571572
token = token.Replace("OAuth ", "");
572573
if (objIntegratedSecurityLevel == GAMSecurityLevel.SecurityLow)
573574
{
574575
bool isOK;
575-
GxResult result = GxSecurityProvider.Provider.checkaccesstoken(_gxContext, token, out isOK);
576+
if (Config.GetValueOf("CSRFToken", out string useCSRFTokenStr) && bool.TryParse(useCSRFTokenStr, out bool useCSRFTokenValue))
577+
{
578+
useCSRFToken = useCSRFTokenValue;
579+
}
580+
GxResult result = GxSecurityProvider.Provider.checkaccesstoken(_gxContext, useCSRFToken, out CSRFToken, out isOK);
576581
if (!isOK)
577582
{
578583
HttpHelper.SetGamError(_httpContext, result.Code, result.Description);
579584
return false;
580585
}
586+
else
587+
{
588+
if (!string.IsNullOrEmpty(CSRFToken))
589+
AddHeader(HttpHeader.X_GXCSRF_TOKEN, CSRFToken);
590+
}
581591
}
582592
else if (objIntegratedSecurityLevel == GAMSecurityLevel.SecurityHigh)
583593
{
584594
bool sessionOk, permissionOk;
585-
GxResult result = GxSecurityProvider.Provider.checkaccesstokenprm(_gxContext, token, objPermissionPrefix, out sessionOk, out permissionOk);
595+
GxResult result = GxSecurityProvider.Provider.checkaccesstokenprm(_gxContext, useCSRFToken, objPermissionPrefix, out CSRFToken, out sessionOk, out permissionOk);
586596
if (permissionOk)
587597
{
598+
if (!string.IsNullOrEmpty(CSRFToken))
599+
AddHeader(HttpHeader.X_GXCSRF_TOKEN, CSRFToken);
588600
return true;
589601
}
590602
else

0 commit comments

Comments
 (0)