first commit
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user