app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "SSO.ApplicationCookie", CookieDomain = ".newsystem.localhost", ExpireTimeSpan = new TimeSpan(6, 0, 0), SlidingExpiration = true }); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") });
<?xml version="1.0"?> <SAMLConfiguration xmlns="urn:componentspace:SAML:2.0:configuration"> <!-- Identity provider configuration --> <IdentityProvider Name="urn:example:SAML:2.0:idp.newsystem.localhost" LocalCertificateSerialNumber="blabla"/> <!-- Service provider configuration --> <ServiceProvider Name="urn:example:SAML:2.0:idp.newsystem.localhost" AssertionConsumerServiceUrl="https://idp.newsystem.localhost/sso/idp/sp/AssertionConsumerService" LocalCertificateSerialNumber="blabla"/> <!-- Partner Identity providers configuration --> <PartnerIdentityProvider Name="urn:3rdPartyIdP" SignAuthnRequest="false" WantSAMLResponseSigned="true" WantAssertionSigned="false" WantAssertionEncrypted="false" SingleSignOnServiceUrl="http://localhost:50320/SAML/SSOService" SingleLogoutServiceUrl="http://localhost:50320/SAML/SLOService" PartnerCertificateSerialNumber="blabla"/> <!-- Service providers configurations --> <PartnerServiceProvider Name="urn:lms" WantAuthnRequestSigned="false" SignSAMLResponse="true" SignAssertion="false" EncryptAssertion="false" AssertionConsumerServiceUrl="https://lms.localhost/sso/sp/AssertionConsumerService.aspx" SingleLogoutServiceUrl="https://lms.localhost/sso/sp/SingleLogoutHandler.aspx" PartnerCertificateSerialNumber="blabla"/> </SAMLConfiguration>
SAMLConfiguration.Load();
var identityProviderConfigurationId = SAMLConfiguration.Current.LocalIdentityProviderConfiguration.Name; var identityProviderConfiguration = new SAMLConfiguration { LocalIdentityProviderConfiguration = SAMLConfiguration.Current.LocalIdentityProviderConfiguration, PartnerServiceProviderConfigurations = SAMLConfiguration.Current.PartnerServiceProviderConfigurations, LocalServiceProviderConfiguration = SAMLConfiguration.Current.LocalServiceProviderConfiguration, PartnerIdentityProviderConfigurations = SAMLConfiguration.Current.PartnerIdentityProviderConfigurations, ReloadOnConfigurationChange = SAMLConfiguration.Current.ReloadOnConfigurationChange, CertificateManager = SAMLConfiguration.Current.CertificateManager, TraceLevel = SAMLConfiguration.Current.TraceLevel }; SAMLConfiguration.Configurations.Add(identityProviderConfigurationId, identityProviderConfiguration);
var partnerIdentityProviderConfigurations = new Dictionary<string, PartnerIdentityProviderConfiguration> { { identityProviderConfigurationId, new PartnerIdentityProviderConfiguration { Name = identityProviderConfigurationId, SignAuthnRequest = true, WantSAMLResponseSigned = false, WantAssertionSigned = false, WantAssertionEncrypted = false, SingleSignOnServiceUrl = string.Format("https://{0}/sso/ssoservice", identityProviderHost), SingleLogoutServiceUrl = string.Format("https://{0}/sso/sloidpservice", identityProviderHost), PartnerCertificateSerialNumber = identityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateSerialNumber, PartnerCertificateFile = identityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateFile, PartnerCertificateSubject = identityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateSubject, PartnerCertificateThumbprint = identityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateThumbprint } } };
var spConfigurationId = string.Format("urn:example:saml:2.0:{0}", domain); SAMLConfiguration.Configurations.Add(spConfigurationId, new SAMLConfiguration { LocalServiceProviderConfiguration = new LocalServiceProviderConfiguration { Name = spConfigurationId, AssertionConsumerServiceUrl = string.Format("https://{0}/sso/assertionconsumerservice", domain), LocalCertificateSerialNumber = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateSerialNumber, LocalCertificateFile = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateFile, LocalCertificatePassword = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificatePassword, LocalCertificatePasswordKey = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificatePasswordKey, LocalCertificateSubject = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateSubject, LocalCertificateThumbprint = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateThumbprint }, PartnerIdentityProviderConfigurations = partnerIdentityProviderConfigurations }); } identityProviderConfiguration .PartnerServiceProviderConfigurations .Add(spConfigurationId, new PartnerServiceProviderConfiguration { Name = spConfigurationId, WantAuthnRequestSigned = false, SignSAMLResponse = true, SignAssertion = false, EncryptAssertion = false, AssertionConsumerServiceUrl = string.Format("https://{0}/sso/assertionconsumerservice", domain), SingleLogoutServiceUrl = string.Format("https://{0}/sso/slospservice", domain), PartnerCertificateSerialNumber = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateSerialNumber, PartnerCertificateFile = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateFile, PartnerCertificateSubject = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateSubject, PartnerCertificateThumbprint = IdentityProviderConfiguration.LocalIdentityProviderConfiguration.LocalCertificateThumbprint });
AssertionConsumerServiceUrl = string.Format("https://{0}/proxy/assertionconsumerservice", domain), SingleLogoutServiceUrl = string.Format("https://{0}/proxy/sloservice", domain),
public class SessionStore : AbstractSSOSessionStore { public override object Load(Type type) { var sessionObject = RedisSsoSessionComponent.Load(GetDatabaseSessionId(type)); return sessionObject != null && sessionObject.Length > 0 ? Deserialize(sessionObject) : null; } public override void Save(object ssoSession) { RedisSsoSessionComponent.Save(Serialize(ssoSession), GetDatabaseSessionId(ssoSession.GetType())); } public override string SessionID { get { CookieFacade.SsoSessionId; } } private string GetDatabaseSessionId(Type type) { return string.Format("{0}:{1}", SessionID, type.Name); } }
string cookieName = "SsoSessionId"; var cookie = HttpContext.Current.Request.Cookies[cookieName]; if (cookie != null && !string.IsNullOrEmpty(cookie.Value)) { return cookie.Value; } cookie = HttpContext.Current.Response.Cookies[cookieName]; if (cookie != null && !string.IsNullOrEmpty(cookie.Value)) { return cookie.Value; } var sessionId = Guid.NewGuid().ToString(); cookie = new HttpCookie(cookieName, sessionId); HttpContext.Current.Response.Cookies.Remove(cookie.Name); HttpContext.Current.Response.AppendCookie(cookie); return sessionId;
SAMLConfiguration.SSOSessionStore = new SessionStore();
public class SamlIdentityProviderAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (string.IsNullOrWhiteSpace(SAMLConfiguration.ConfigurationID) || !SAMLConfiguration.ConfigurationID.Equals(SamlConfig.IdentityProviderConfigurationId, StringComparison.InvariantCultureIgnoreCase)) { SAMLConfiguration.ConfigurationID = SamlConfig.IdentityProviderConfigurationId; } base.OnActionExecuting(filterContext); } } public class SamlServiceProviderAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { string spConfigurationId = string.Format("urn:example:saml:2.0:{0}", domain); if (string.IsNullOrWhiteSpace(SAMLConfiguration.ConfigurationID) || !SAMLConfiguration.ConfigurationID.Equals(spConfigurationId, StringComparison.InvariantCultureIgnoreCase)) { SAMLConfiguration.ConfigurationID = spConfigurationId; } base.OnActionExecuting(filterContext); } }
// SAMLIdentityProvider.ReceiveSSO(Request, out partnerSp); // , Low level API HTTPRedirectBinding.ReceiveRequest(HttpContext.Request, out authnRequestElement, out relayState, out signatureAlgorithm, out signature); domains = _ssoComponent.GetSchoolDomains(authnRequestElement); // if (HttpContext.User.Identity.IsAuthenticated) { return RedirectToAction(MVC.SamlIdentityProvider.SsoComplete()); } // IdPLogin , return Redirect(GetDomainLoginUrl(domain)); // , return RedirectToAction(MVC.SamlIdentityProvider.SchoolSelect());
// SAML var attributes = new Dictionary<string, string> { { Saml2Helper.Attributes.UserRoleKey, userIdentity.UserRole.ToString() }, { Saml2Helper.Attributes.UserFirstNameKey, userIdentity.FirstName }, { Saml2Helper.Attributes.UserLastNameKey, userIdentity.LastName } }; // SAMLIdentityProvider.SendSSO(Response, userIdentity.UserIdentifier, attributes);
// SAMLIdentityProvider.ReceiveSLO(Request, Response, out isRequest, out hasCompleted, out logoutReason, out partnerServiceProvider); // IdP HttpContext.GetOwinContext().Authentication.SignOut(); // SP, SP SAMLIdentityProvider.SendSLO(Response, null); // IdP SAMLServiceProvider.SendSLO(Response, null);
// IdPLogin
// SSO IdP SAMLServiceProvider.InitiateSSO(Response, null, partnerIdP);
// IdP SAMLServiceProvider.ReceiveSSO(Request, out isInResponseTo, out partnerIdP, out userName, out attributes, out relayState); // var user = await userManager.FindAsync(new UserLoginInfo(“IdP”, userId)); // IdP , SP await _nativeLoginProcessor.SignInAsync(user); return Redirect(MVC.SamlIdentityProvider.SsoComplete()); // “ ”
// IdP SAMLServiceProvider.ReceiveSLO(Request, out isRequest, out logoutReason, out partnerIdP); // HttpContext.GetOwinContext().Authentication.SignOut("SSO.ApplicationCookie"); // SP SAMLIdentityProvider.InitiateSLO(Response, null); // SP SAMLIdentityProvider.SendSLO(Response, null);
// , IdP await _nativeLoginProcessor.SignInAsync(user); // return RedirectToAction(MVC.SamlIdentityProvider.SsoComplete()); // IdP SSO return RedirectToAction(MVC.SamlIdentityProvider.InitSso(partnerIdP));
// IdP SAMLServiceProvider.ReceiveSSO(Request, out isInResponseTo, out partnerIdP, out userName, out attributes, out relayState); // var user = await _samlServiceProviderComponent.FindUserAsync(attributes); // , relayState await _nativeLoginProcessor.LocalSignInAsync(user); return RedirectToLocal(relayState); // return RedirectToAction(MVC.SamlServiceProvider.LogOut());
// SAMLServiceProvider.ReceiveSLO(Request, out isRequest, out logoutReason, out partnerIdP); // HttpContext.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); // , IdP SAMLServiceProvider.SendSLO(Response, null); // , return RedirectToAction(MVC.Account.Login());
// “ , , ”
// IdP SAMLServiceProvider.InitiateSSO(Response, returnUrl, SamlConfig.IdentityProviderConfigurationId);
// HttpContext.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie) // IdP SAMLServiceProvider.InitiateSLO(Response, null);
// SAMLServiceProvider.InitiateSSO(Response, relayState, SamlConfig.IdentityProviderConfigurationId);
// IdP SAMLServiceProvider.ReceiveSSO(Request, out isInResponseTo, out partnerIdP, out userName, out attributes, out relayState); // var user = await _samlServiceProviderComponent.FindUserAsync(attributes); // , , string timeStamp = DateTime.UtcNow.ToString("yyyyMMddHHmm"); string queryParams = string.Format("userId={0}&userLoginProvider={1}Ă—tamp={2}&auth={3}", userId, userLoginProviderKey, timeStamp, MD5Helper.ComputeHash(string.Format("{0}{1}{2}{3}", userId, userLoginProviderKey, timeStamp, "Secret"))); // return RedirectToAction(MVC.Proxy.LogOut());
// SAMLServiceProvider.InitiateSLO(Response, null);
// SAMLServiceProvider.ReceiveSLO(Request, out isRequest, out logoutReason, out partnerIdP); // , ProcessSlo
// SAMLServiceProvider.SendSLO(HttpContext.Response, null);
// “ , , ”
Source: https://habr.com/ru/post/280806/
All Articles