
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