/// <summary> /// Google requires that all return data be packed into a "state" parameter. /// Check if authentication succeeded after user is redirected back from the service provider. /// </summary> /// <param name="context">The context.</param> /// <param name="returnPageUrl">The return URL which should match the value passed to RequestAuthentication() method.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The authentication.</returns> public override AuthenticationResult VerifyAuthentication(System.Web.HttpContextBase context, Uri returnPageUrl) { var stateString = System.Web.HttpUtility.UrlDecode(context.Request.QueryString["state"]); if (stateString == null || !stateString.Contains("__provider__=google")) return base.VerifyAuthentication(context, returnPageUrl); var q = System.Web.HttpUtility.ParseQueryString(stateString); q.Add(context.Request.QueryString); q.Remove("state"); context.RewritePath(context.Request.Path + "?" + q); return base.VerifyAuthentication(context, returnPageUrl); }
/// <summary> /// Implements the Early Url Localization logic. /// <see href="https://docs.google.com/drawings/d/1cH3_PRAFHDz7N41l8Uz7hOIRGpmgaIlJe0fYSIOSZ_Y/edit?usp=sharing"/> /// </summary> public void ProcessIncoming( System.Web.HttpContextBase context) { // Is URL explicitly excluded from localization? if (!m_urlLocalizer.FilterIncoming(context.Request.Url)) { return; } // YES. Continue handling request. bool allowRedirect = context.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase) || context.Request.HttpMethod.Equals("HEAD", StringComparison.OrdinalIgnoreCase); // NO. Is request URL localized? string urlNonlocalized; string langtag = m_urlLocalizer.ExtractLangTagFromUrl(context, context.Request.RawUrl, UriKind.Relative, true, out urlNonlocalized); if (langtag == null) { // NO. // langtag = best match between // 1. Inferred user languages (cookie and Accept-Language header) // 2. App Languages. LanguageTag lt = context.GetInferredLanguage(); // If redirection allowed...redirect user agent (browser) to localized URL. // The principle purpose of this redirection is to ensure the browser is showing the correct URL // in its address field. if (allowRedirect) { RedirectWithLanguage(context, context.Request.RawUrl, lt.ToString(), m_urlLocalizer); return; } // Otherwise, handle the request under the language infered above but without doing the redirect. // NB: this will mean that the user agent (browser) won't have the correct URL displayed; // however, this typically won't be an issue because we are talking about POST, PUT and DELETE methods // here which are typically not shown to the user. else { context.SetPrincipalAppLanguageForRequest(lt); return; // Continue handling request. } } // YES. Does langtag EXACTLY match an App Language? LanguageTag appLangTag = LanguageHelpers.GetMatchingAppLanguage(langtag); if (appLangTag.IsValid() && appLangTag.Equals(langtag)) { // YES. Establish langtag as the PAL for the request. context.SetPrincipalAppLanguageForRequest(appLangTag); // Rewrite URL for this request. context.RewritePath(urlNonlocalized); // Continue handling request. return; } // NO. Does langtag LOOSELY match an App Language? else if (appLangTag.IsValid() && !appLangTag.Equals(langtag)) { // YES. Localize URL with matching App Language. // Conditionally redirect user agent to localized URL. if (allowRedirect) { RedirectWithLanguage(context, urlNonlocalized, appLangTag.ToString(), m_urlLocalizer); return; } } // NO. Do nothing to URL; expect a 404 which corresponds to language not supported. // Continue handling request. }
public void HandleRequest(System.Web.HttpContext context, params string[] args) { context.RewritePath("~/archive" + (args.Length > 0 ? "/" : "") + args.Implode("/"), false) ; }