summaryrefslogtreecommitdiffstats
path: root/src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs')
-rw-r--r--src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs71
1 files changed, 47 insertions, 24 deletions
diff --git a/src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs b/src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs
index 918efdf..b6cab0e 100644
--- a/src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs
+++ b/src/DotNetOpenAuth.OpenId.RelyingParty.UI/OpenId/RelyingParty/OpenIdAjaxRelyingParty.cs
@@ -11,11 +11,14 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
using System.Globalization;
using System.Linq;
using System.Net;
+ using System.Net.Http;
+ using System.Net.Http.Headers;
using System.Net.Mime;
using System.Text;
+ using System.Threading;
+ using System.Threading.Tasks;
using System.Web;
using System.Web.Script.Serialization;
-
using DotNetOpenAuth.Configuration;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId.Extensions;
@@ -63,8 +66,9 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// <para>No exception is thrown if no OpenID endpoints were discovered.
/// An empty enumerable is returned instead.</para>
/// </remarks>
- public override IEnumerable<IAuthenticationRequest> CreateRequests(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) {
- var requests = base.CreateRequests(userSuppliedIdentifier, realm, returnToUrl);
+ public override async Task<IEnumerable<IAuthenticationRequest>> CreateRequestsAsync(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl, CancellationToken cancellationToken) {
+ var requests = await base.CreateRequestsAsync(userSuppliedIdentifier, realm, returnToUrl, cancellationToken);
+ var results = new List<IAuthenticationRequest>();
// Alter the requests so that have AJAX characteristics.
// Some OPs may be listed multiple times (one with HTTPS and the other with HTTP, for example).
@@ -113,8 +117,10 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
// http://www.nabble.com/Re:-Defining-how-OpenID-should-behave-with-fragments-in-the-return_to-url-p22694227.html
////TODO:
- yield return req;
+ results.Add(req);
}
+
+ return results;
}
/// <summary>
@@ -142,13 +148,15 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// }
/// </code>
/// </remarks>
- public OutgoingWebResponse AsAjaxDiscoveryResult(IEnumerable<IAuthenticationRequest> requests) {
+ public async Task<HttpResponseMessage> AsAjaxDiscoveryResultAsync(IEnumerable<IAuthenticationRequest> requests, CancellationToken cancellationToken) {
Requires.NotNull(requests, "requests");
var serializer = new JavaScriptSerializer();
- return new OutgoingWebResponse {
- Body = serializer.Serialize(this.AsJsonDiscoveryResult(requests)),
+ var response = new HttpResponseMessage {
+ Content = new StringContent(serializer.Serialize(await this.AsJsonDiscoveryResultAsync(requests, cancellationToken))),
};
+ response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
+ return response;
}
/// <summary>
@@ -159,11 +167,11 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// <returns>
/// The JSON result to return to the user agent.
/// </returns>
- public string AsAjaxPreloadedDiscoveryResult(IEnumerable<IAuthenticationRequest> requests) {
+ public async Task<string> AsAjaxPreloadedDiscoveryResultAsync(IEnumerable<IAuthenticationRequest> requests, CancellationToken cancellationToken) {
Requires.NotNull(requests, "requests");
var serializer = new JavaScriptSerializer();
- string json = serializer.Serialize(this.AsJsonPreloadedDiscoveryResult(requests));
+ string json = serializer.Serialize(await this.AsJsonPreloadedDiscoveryResultAsync(requests, cancellationToken));
string script = "window.dnoa_internal.loadPreloadedDiscoveryResults(" + json + ");";
return script;
@@ -174,18 +182,27 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// </summary>
/// <param name="requests">The discovery results from just <i>one</i> identifier to serialize as a JSON response.</param>
/// <returns>A JSON object, not yet serialized.</returns>
- internal object AsJsonDiscoveryResult(IEnumerable<IAuthenticationRequest> requests) {
+ internal async Task<object> AsJsonDiscoveryResultAsync(IEnumerable<IAuthenticationRequest> requests, CancellationToken cancellationToken) {
Requires.NotNull(requests, "requests");
requests = requests.CacheGeneratedResults();
if (requests.Any()) {
+ var requestUrls =
+ requests.Select(
+ req =>
+ new {
+ endpoint = req.Provider.Uri.AbsoluteUri,
+ immediate = this.GetRedirectUrlAsync(req, true, cancellationToken),
+ setup = this.GetRedirectUrlAsync(req, false, cancellationToken),
+ }).ToList();
+ await Task.WhenAll(requestUrls.Select(r => r.immediate).Concat(requestUrls.Select(r => r.setup)));
return new {
claimedIdentifier = (string)requests.First().ClaimedIdentifier,
- requests = requests.Select(req => new {
- endpoint = req.Provider.Uri.AbsoluteUri,
- immediate = this.GetRedirectUrl(req, true),
- setup = this.GetRedirectUrl(req, false),
+ requests = requestUrls.Select(req => new {
+ endpoint = req.endpoint,
+ immediate = req.immediate.Result, // await already took place
+ setup = req.setup.Result, // await already took place
}).ToArray()
};
} else {
@@ -204,7 +221,7 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// <returns>
/// A JSON object, not yet serialized to a string.
/// </returns>
- private object AsJsonPreloadedDiscoveryResult(IEnumerable<IAuthenticationRequest> requests) {
+ private async Task<object> AsJsonPreloadedDiscoveryResultAsync(IEnumerable<IAuthenticationRequest> requests, CancellationToken cancellationToken) {
Requires.NotNull(requests, "requests");
// We prepare a JSON object with this interface:
@@ -214,13 +231,18 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
// string userSuppliedIdentifier;
// jsonResponse discoveryResult; // contains result of call to SerializeDiscoveryAsJson(Identifier)
// }
- var json = (from request in requests
- group request by request.DiscoveryResult.UserSuppliedIdentifier into requestsByIdentifier
- select new {
- userSuppliedIdentifier = (string)requestsByIdentifier.Key,
- discoveryResult = this.AsJsonDiscoveryResult(requestsByIdentifier),
- }).ToArray();
-
+ var jsonAsync = (from request in requests
+ group request by request.DiscoveryResult.UserSuppliedIdentifier into requestsByIdentifier
+ select new {
+ userSuppliedIdentifier = (string)requestsByIdentifier.Key,
+ discoveryResult = this.AsJsonDiscoveryResultAsync(requestsByIdentifier, cancellationToken),
+ }).ToArray();
+ await Task.WhenAll(jsonAsync.Select(j => j.discoveryResult));
+ var json = from j in jsonAsync
+ select new {
+ userSuppliedIdentifier = j.userSuppliedIdentifier,
+ discoveryResult = j.discoveryResult.Result, // await happened previously
+ };
return json;
}
@@ -232,11 +254,12 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// <param name="immediate"><c>true</c>to create a checkid_immediate request;
/// <c>false</c> to create a checkid_setup request.</param>
/// <returns>The absolute URL that carries the entire OpenID message.</returns>
- private Uri GetRedirectUrl(IAuthenticationRequest request, bool immediate) {
+ private async Task<Uri> GetRedirectUrlAsync(IAuthenticationRequest request, bool immediate, CancellationToken cancellationToken) {
Requires.NotNull(request, "request");
request.Mode = immediate ? AuthenticationRequestMode.Immediate : AuthenticationRequestMode.Setup;
- return request.RedirectingResponse.GetDirectUriRequest(this.Channel);
+ var response = await request.GetRedirectingResponseAsync(cancellationToken);
+ return response.GetDirectUriRequest();
}
}
}