From 56c641132f4fbbf827eaba764212b4c5cd841e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20Roussin-B=C3=A9langer?= Date: Sat, 28 Mar 2015 15:59:49 -0400 Subject: [PATCH 1/4] Added wargaming openid login --- Owin.Security.Providers/Wargaming/Constant.cs | 12 ++++++ ...argamingAccountAuthenticationExtensions.cs | 40 +++++++++++++++++++ .../WargamingAuthenticationHandler.cs | 39 ++++++++++++++++++ .../WargamingAuthenticationMiddleware.cs | 32 +++++++++++++++ .../WargamingAuthenticationOptions.cs | 28 +++++++++++++ 5 files changed, 151 insertions(+) create mode 100644 Owin.Security.Providers/Wargaming/Constant.cs create mode 100644 Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs create mode 100644 Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs create mode 100644 Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs create mode 100644 Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs diff --git a/Owin.Security.Providers/Wargaming/Constant.cs b/Owin.Security.Providers/Wargaming/Constant.cs new file mode 100644 index 0000000..9abca13 --- /dev/null +++ b/Owin.Security.Providers/Wargaming/Constant.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Owin.Security.Providers.Wargaming +{ + internal static class Constants + { + internal const string DefaultAuthenticationType = "Wargaming"; + } +} \ No newline at end of file diff --git a/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs b/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs new file mode 100644 index 0000000..764096f --- /dev/null +++ b/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs @@ -0,0 +1,40 @@ +using Microsoft.Owin; +using System; + +namespace Owin.Security.Providers.Wargaming +{ + public static class WargamingAccountAuthenticationExtensions + { + public static IAppBuilder UseWargamingAccountAuthentication(this IAppBuilder app, WargamingAuthenticationOptions options) + { + if (app == null) + { + throw new ArgumentNullException("app"); + } + if (options == null) + { + throw new ArgumentNullException("options"); + } + + return app.Use(typeof(WargamingAuthenticationMiddleware), app, options); + } + + /// + /// Authenticate users using Steam + /// + /// The passed to the configuration method + /// The wargaming application key + /// The updated + public static IAppBuilder UseWargamingAccountAuthentication(this IAppBuilder app, string appId) + { + return UseWargamingAccountAuthentication(app, new WargamingAuthenticationOptions + { + ProviderDiscoveryUri = "https://na.wargaming.net/id/openid/", + Caption = "Wargaming", + AuthenticationType = "Wargaming", + CallbackPath = new PathString("/signin-wargaming"), + AppId = appId + }); + } + } +} \ No newline at end of file diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs new file mode 100644 index 0000000..8638584 --- /dev/null +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs @@ -0,0 +1,39 @@ +using Microsoft.Owin.Logging; +using Newtonsoft.Json; +using Owin.Security.Providers.OpenID; +using System.Collections.Generic; +using System.Net.Http; +using System.Security.Claims; +using System.Text.RegularExpressions; +using Newtonsoft.Json.Converters; +using System.Data; + +namespace Owin.Security.Providers.Wargaming +{ + internal sealed class WargamingAuthenticationHandler : OpenIDAuthenticationHandlerBase + { + + private readonly Regex AccountIDRegex = new Regex(@"^https://na.wargaming.net/id/([0-9]{10}).*$", RegexOptions.Compiled); + + private const string UserInfoUri = "https://api.worldoftanks.com/wot/account/info/?application_id={0}&account_id={1}&fields=nickname"; + + public WargamingAuthenticationHandler(HttpClient httpClient, ILogger logger) + : base(httpClient, logger) + { + } + + protected override void SetIdentityInformations(ClaimsIdentity identity, string claimedID, IDictionary attributeExchangeProperties) + { + Match accountIDMatch = AccountIDRegex.Match(claimedID); + if (accountIDMatch.Success) + { + string accountID = accountIDMatch.Groups[1].Value; + var getUserInfoTask = _httpClient.GetStringAsync(string.Format(UserInfoUri, Options.AppId, accountID)); + getUserInfoTask.Wait(); + string userInfoRaw = getUserInfoTask.Result; + dynamic userInfo = JsonConvert.DeserializeObject(userInfoRaw); + identity.AddClaim(new Claim(ClaimTypes.Name, (string)userInfo["data"][accountID].nickname, "http://www.w3.org/2001/XMLSchema#string", Options.AuthenticationType)); + } + } + } +} \ No newline at end of file diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs new file mode 100644 index 0000000..7625ab3 --- /dev/null +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs @@ -0,0 +1,32 @@ +using System; +using System.Globalization; +using System.Net.Http; +using Microsoft.Owin; +using Microsoft.Owin.Logging; +using Microsoft.Owin.Security; +using Microsoft.Owin.Security.DataHandler; +using Microsoft.Owin.Security.DataProtection; +using Microsoft.Owin.Security.Infrastructure; +using Owin.Security.Providers.OpenID; + +namespace Owin.Security.Providers.Wargaming +{ + public class WargamingAuthenticationMiddleware : OpenIDAuthenticationMiddlewareBase + { + + /// + /// Initializes a + /// + /// The next middleware in the OWIN pipeline to invoke + /// The OWIN application + /// Configuration options for the middleware + public WargamingAuthenticationMiddleware(OwinMiddleware next, IAppBuilder app, WargamingAuthenticationOptions options) + : base(next, app, options) + { } + + protected override AuthenticationHandler CreateSpecificHandler() + { + return new WargamingAuthenticationHandler(_httpClient, _logger); + } + } +} diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs new file mode 100644 index 0000000..804cddd --- /dev/null +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Net.Http; +using Microsoft.Owin; +using Microsoft.Owin.Security; +using Owin.Security.Providers.OpenID; + +namespace Owin.Security.Providers.Wargaming +{ + public class WargamingAuthenticationOptions : OpenIDAuthenticationOptions + { + + public enum Region + { + Europe, + US, + Russia + } + + /// + /// Gets or sets the Wargaming-assigned appId + /// + public string AppId { get; set; } + } + + +} From 4bda111678be6bdd5c3c21f8b66fdb06823846bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20Roussin-B=C3=A9langer?= Date: Sat, 28 Mar 2015 16:00:19 -0400 Subject: [PATCH 2/4] Added modified csprof for wargaming --- Owin.Security.Providers/Owin.Security.Providers.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Owin.Security.Providers/Owin.Security.Providers.csproj b/Owin.Security.Providers/Owin.Security.Providers.csproj index a638670..828d37d 100644 --- a/Owin.Security.Providers/Owin.Security.Providers.csproj +++ b/Owin.Security.Providers/Owin.Security.Providers.csproj @@ -251,6 +251,11 @@ + + + + + From fdd5ab6b1be0e63540ad9428b273fc1ae4a54a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20Roussin-B=C3=A9langer?= Date: Sat, 28 Mar 2015 16:02:11 -0400 Subject: [PATCH 3/4] Added comments --- .../WargamingAccountAuthenticationExtensions.cs | 9 +++++++++ .../Wargaming/WargamingAuthenticationHandler.cs | 3 --- .../Wargaming/WargamingAuthenticationMiddleware.cs | 3 +++ .../Wargaming/WargamingAuthenticationOptions.cs | 4 +++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs b/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs index 764096f..ea0fd36 100644 --- a/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs +++ b/Owin.Security.Providers/Wargaming/WargamingAccountAuthenticationExtensions.cs @@ -3,8 +3,17 @@ using System; namespace Owin.Security.Providers.Wargaming { + /// + /// Extension methods for using + /// public static class WargamingAccountAuthenticationExtensions { + /// + /// Authenticate users using Wargaming + /// + /// The passed to the configuration method + /// Middleware configuration options + /// The updated public static IAppBuilder UseWargamingAccountAuthentication(this IAppBuilder app, WargamingAuthenticationOptions options) { if (app == null) diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs index 8638584..8bb5477 100644 --- a/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationHandler.cs @@ -5,14 +5,11 @@ using System.Collections.Generic; using System.Net.Http; using System.Security.Claims; using System.Text.RegularExpressions; -using Newtonsoft.Json.Converters; -using System.Data; namespace Owin.Security.Providers.Wargaming { internal sealed class WargamingAuthenticationHandler : OpenIDAuthenticationHandlerBase { - private readonly Regex AccountIDRegex = new Regex(@"^https://na.wargaming.net/id/([0-9]{10}).*$", RegexOptions.Compiled); private const string UserInfoUri = "https://api.worldoftanks.com/wot/account/info/?application_id={0}&account_id={1}&fields=nickname"; diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs index 7625ab3..7fa890b 100644 --- a/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs @@ -11,6 +11,9 @@ using Owin.Security.Providers.OpenID; namespace Owin.Security.Providers.Wargaming { + /// + /// OWIN middleware for authenticating users using an OpenID provider + /// public class WargamingAuthenticationMiddleware : OpenIDAuthenticationMiddlewareBase { diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs index 804cddd..040cf0a 100644 --- a/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationOptions.cs @@ -10,7 +10,9 @@ namespace Owin.Security.Providers.Wargaming { public class WargamingAuthenticationOptions : OpenIDAuthenticationOptions { - + /// + /// Region to use for to log in + /// public enum Region { Europe, From d0981d98e116deb93e2501d596b89d83eb98ec30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20Roussin-B=C3=A9langer?= Date: Wed, 8 Apr 2015 12:26:56 -0400 Subject: [PATCH 4/4] Fixed documentation --- .../Wargaming/WargamingAuthenticationMiddleware.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs b/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs index 7fa890b..3f541e3 100644 --- a/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs +++ b/Owin.Security.Providers/Wargaming/WargamingAuthenticationMiddleware.cs @@ -18,7 +18,7 @@ namespace Owin.Security.Providers.Wargaming { /// - /// Initializes a + /// Initializes a /// /// The next middleware in the OWIN pipeline to invoke /// The OWIN application