first commit

This commit is contained in:
Zeeshaun
2026-03-11 11:18:25 -05:00
commit f3cb730f3b
472 changed files with 53651 additions and 0 deletions
@@ -0,0 +1,74 @@
using Landmark.OLA.Models.OnlineBanking;
using System.Security.Authentication;
using System.Xml.Linq;
namespace OnlineBankingAuth.Parsers
{
public class AuthTokenParser : IAuthTokenParser
{
public AuthTokenResponse ParseAuthTokenResponse(XElement xElement)
{
try
{
var accessToken = (string)xElement.Element("access_token");
if (String.IsNullOrEmpty(accessToken))
{
return ParseErroneousAuthTokenResponse(xElement);
}
var authToken = new AuthToken
{
DiFiid = (string)xElement.Element("di_fiid"),
DiFicustomer = (string)xElement.Element("di_ficustomer"),
DiMemberNumber = (string)xElement.Element("di_member_number"),
AccessToken = (string)xElement.Element("access_token"),
ExpiresIn = (string)xElement.Element("expires_in"),
RefreshToken = (string)xElement.Element("refresh_token"),
RefreshTokenExpiresIn = (string)xElement.Element("refresh_token_expires_in")
};
var authTokenResponse = new AuthTokenResponse
{
Token = authToken,
Status = null
};
return authTokenResponse;
}
catch (Exception e)
{
throw new AuthenticationException($"Could not parse response from IdP vendor. {e.Message}, {e.StackTrace}");
}
}
private AuthTokenResponse ParseErroneousAuthTokenResponse(XElement xElement)
{
var messageElement = (XElement)xElement.FirstNode;
var errorElement = (XElement)xElement.FirstNode.NextNode;
var errorType = (XElement)errorElement.FirstNode;
var errorCode = (XElement)errorElement.FirstNode.NextNode;
var errorMessage = (XElement)errorElement.FirstNode.NextNode.NextNode;
var error = new AuthTokenError
{
ErrorType = errorType.Value,
ErrorCode = errorCode.Value,
ErrorMessage = errorMessage.Value
};
var authTokenStatus = new AuthTokenStatus
{
StatusMessage = messageElement.Value,
ErrorInfo = error
};
return new AuthTokenResponse
{
Status = authTokenStatus
};
}
}
}
@@ -0,0 +1,10 @@
using Landmark.OLA.Models.OnlineBanking;
using System.Xml.Linq;
namespace OnlineBankingAuth.Parsers
{
public interface IAuthTokenParser
{
AuthTokenResponse ParseAuthTokenResponse(XElement xElement);
}
}
@@ -0,0 +1,12 @@
using Landmark.OLA.Models.OnlineBanking;
using System.Xml;
namespace OnlineBankingAuth.Parsers
{
public interface ISAMLParser<T>
{
DISAMLAssertion ParseAssertion(XmlElement xmlElement);
SAMLConditions ParseConditions(XmlElement xmlElement);
AuthenticationStatement ParseAuthnStatement(XmlElement xmlElement);
}
}
@@ -0,0 +1,8 @@
namespace OnlineBankingAuth.Parsers
{
public class SAMLMessaging
{
public string SAMLResponse { get; set; }
}
}
@@ -0,0 +1,70 @@
using Landmark.OLA.Models.OnlineBanking;
using System.Xml;
namespace OnlineBankingAuth.Parsers
{
public class SAMLParser : ISAMLParser<DISAMLAssertion>
{
public string SAML_NAMESPACE = "saml:";
public DISAMLAssertion ParseAssertion(XmlElement xmlElement)
{
try
{
var assertion = new DISAMLAssertion
{
NameID = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "NameID")[0].InnerText,
Recipient = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "SubjectConfirmationData")[0].Attributes[1].InnerText,
MemberID = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "AttributeValue")[0].InnerText,
FI_ID = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "AttributeValue")[1].InnerText,
AuthnStatement = ParseAuthnStatement(xmlElement),
Conditions = ParseConditions(xmlElement),
};
return assertion;
}
catch
{
throw new FormatException("SAML Response is in an unexpected layout.");
}
}
public AuthenticationStatement ParseAuthnStatement(XmlElement xmlElement)
{
try
{
var authnStatement = new AuthenticationStatement
{
SessionIndex = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "AuthnStatement")[0].Attributes[1].InnerText,
AuthContextClassRef = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "AuthnContextClassRef")[0].InnerText
};
return authnStatement;
}
catch
{
throw new FormatException("AuthnStatement is in an unexpected layout.");
}
}
public SAMLConditions ParseConditions(XmlElement xmlElement)
{
try
{
var conditions = new SAMLConditions
{
Audience = xmlElement.GetElementsByTagName(SAML_NAMESPACE + "Audience")[0].InnerText,
NotBefore = DateTime.Parse(xmlElement.GetElementsByTagName(SAML_NAMESPACE + "Conditions")[0].Attributes[0].InnerText),
NotAfter = DateTime.Parse(xmlElement.GetElementsByTagName(SAML_NAMESPACE + "Conditions")[0].Attributes[1].InnerText),
};
return conditions;
}
catch
{
throw new FormatException("SAML Conditions is in an unexpected layout");
}
}
}
}