Visual Studio Load Test redirect URL from Sitemind

2019-07-10 16:25发布

问题:

I have a security application called Siteminder. It creates unique URLS for every authentication. HTTPS://SITE/idp/**RANDOMURLSTRING**/resumeSAML20/idp/startSSO.ping

How can i capture the Unique URL and have the test continue to login.

A webtest assumes the next URL in the process. It does not support[Or I don't know how] a unique redirect to a random URL. Does anyone know of a way to handle this case?

EDIT: My Solution -- Replace the SessionID with {{SessionID}} in all the URLS and use this extraction rule

 public class ExtractSiteMinderCustomUrl : ExtractionRule

    {
        public string SiteMinderSessionID { get; private set; }

        // The Extract method.  The parameter e contains the web performance test context.
        //---------------------------------------------------------------------
        public override void Extract(object sender, ExtractionEventArgs e)
        {
            //look for anchor tags with URLS
                Regex regex = new Regex("<a\\s+(?:[^>]*?\\s+)?href=\"([^\"]+\\?[^\"]+)\"");
            MatchCollection match = regex.Matches(e.Response.BodyString);
            if (match.Count > 0)
            {
                foreach (Match ItemMatch in match)
                {
                    if (ItemMatch.ToString().Contains("/idp/"))
                    {
                        //start and ends string from the sitemindersession is in the link on the page
                        e.WebTest.Context.Add(this.ContextParameterName, GetStringBetween(ItemMatch.ToString(), "/idp/", "/resume"));
                        e.Success = true;
                        return;
                    }
                }
                e.Success = false;
                e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found in Link : /idp/");
            }
            else
            {
                e.Success = false;
                e.Message = String.Format(CultureInfo.CurrentCulture, "No href tags found");
            }
        }

        public static string GetStringBetween(string token, string first, string second)
        {
            if (!token.Contains(first)) return "";

            var afterFirst = token.Split(new[] { first }, StringSplitOptions.None)[1];

            if (!afterFirst.Contains(second)) return "";

            var result = afterFirst.Split(new[] { second }, StringSplitOptions.None)[0];

            return result;
        }

    }

回答1:

The simple answer is to have use extraction rule that gets the **RANDOMURLSTRING** then change the URLs in the requests to be, for example, HTTPS://SITE/idp/{{TheRandomString}}/resumeSAML20/idp/startSSO.ping where TheRandomString is the context parameter that holds the extracted value. Note the doubled curly braces ({{ and }}) around the context parameter.

Suppose a value returned by the first redirection needs to be captured but a normal web test would redirect again and so the response is not seen by the extraction rules. In this case need to handle the redirect explicitly. Set the Follow redirects property of the initial request to false then add extraction rule(s) to gather the wanted values. Add a new request after the initial request and use the extracted values in it as necessary. It is possible to extract the entire redirected url and set the Url field to the extracted value.