public static async Task <ValidationResponse> ValidateAsync(LoginModel login, Cache cache) { try { var client = new SigRClient(Settings.AdminSiteUrl, Settings.STSApiKey, "SiteHub"); var domainName = login.UserName.Split('@')[1].ToLower(); var site = await SiteCache.GetSiteByDomain(cache, domainName); var cred = new STSCredential { Domain = site.OnPremDomainName, UserName = login.UserName, Password = login.Password, RemoteSiteId = site.Id }; await client.StartAsync(); ValidationResponse res = await client.ProcessSTSValidationRequest(cred); return(res); } catch (Exception ex) { Utils.AddLogEntry("Error during user validation", System.Diagnostics.EventLogEntryType.Error, 0, ex); return(new ValidationResponse { IsValid = false }); } }
/// <summary> /// Called by the STS to send a validation request down to the appropriate site. Uses a semaphore to wait /// for the response /// </summary> /// <param name="credential"></param> /// <returns></returns> public async Task <ValidationResponse> ProcessSTSValidationRequest(STSCredential credential) { SendStatus("Processing STS validation request for \"{0}\"...", credential.UserName); validationWaiter.UserName = credential.UserName; await _siteHubProxy.Invoke <STSCredential>("ProcessSTSValidationRequest", credential); return(await validationWaiter.Awaiter.Task); }
/// <summary> /// Site will validate the user's local AD credentials for the cloud STS /// </summary> /// <param name="credential"></param> /// <returns></returns> public static ValidationResponse GetValidationResponse(STSCredential credential) { var data = new ValidationResponse(); data.UserName = credential.UserName; data.STSConnectionId = credential.STSConnectionId; // create a "principal context" - e.g. your domain (could be machine, too) using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, credential.Domain)) { // validate the credentials data.IsValid = pc.ValidateCredentials(credential.UserName, credential.Password, ContextOptions.Sealing); } if (data.IsValid) { data.UserProperties = ADTools.SearchName(credential.UserName); } return(data); }
/// <summary> /// When a validation request is received from the STS, this method forwards the request to the appropriate site /// </summary> /// <param name="credential"></param> public void ProcessSTSValidationRequest(STSCredential credential) { credential.STSConnectionId = Context.ConnectionId; Clients.Group(credential.RemoteSiteId).Validate(credential); }