From f948fc07fef33a15d6cc5afe56230305e0d73f8c Mon Sep 17 00:00:00 2001 From: Claire Davis Date: Thu, 12 May 2022 19:54:57 -0700 Subject: [PATCH] Initial commit --- GoogleLogin.sln | 20 ++ GoogleLogin/GoogleLogin.csproj | 131 ++++++++ GoogleLogin/GoogleLogin.csproj.user | 31 ++ GoogleLogin/Properties/AssemblyInfo.cs | 35 ++ GoogleLogin/Web.Debug.config | 30 ++ GoogleLogin/Web.Release.config | 31 ++ GoogleLogin/Web.config | 14 + GoogleLogin/bin/GoogleLogin.dll | Bin 0 -> 10240 bytes GoogleLogin/bin/GoogleLogin.pdb | Bin 0 -> 22016 bytes GoogleLogin/footer.aspx | 27 ++ GoogleLogin/footer.aspx.cs | 17 + GoogleLogin/footer.aspx.designer.cs | 26 ++ GoogleLogin/header.aspx | 94 ++++++ GoogleLogin/header.aspx.cs | 17 + GoogleLogin/header.aspx.designer.cs | 15 + GoogleLogin/login.aspx | 67 ++++ GoogleLogin/login.aspx.cs | 304 ++++++++++++++++++ GoogleLogin/login.aspx.designer.cs | 15 + ...amework,Version=v4.5.AssemblyAttributes.cs | 4 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 8255 bytes .../GoogleLogin.csproj.FileListAbsolute.txt | 5 + .../GoogleLogin.csprojAssemblyReference.cache | Bin 0 -> 22074 bytes ...Login.csprojResolveAssemblyReference.cache | Bin 0 -> 3318 bytes GoogleLogin/obj/Debug/GoogleLogin.dll | Bin 0 -> 10240 bytes GoogleLogin/obj/Debug/GoogleLogin.pdb | Bin 0 -> 22016 bytes ...le_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0 ...le_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0 ...le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0 GoogleLogin/scripts.js | 28 ++ GoogleLogin/style.css | 74 +++++ README.md | 12 +- 31 files changed, 995 insertions(+), 2 deletions(-) create mode 100644 GoogleLogin.sln create mode 100644 GoogleLogin/GoogleLogin.csproj create mode 100644 GoogleLogin/GoogleLogin.csproj.user create mode 100644 GoogleLogin/Properties/AssemblyInfo.cs create mode 100644 GoogleLogin/Web.Debug.config create mode 100644 GoogleLogin/Web.Release.config create mode 100644 GoogleLogin/Web.config create mode 100644 GoogleLogin/bin/GoogleLogin.dll create mode 100644 GoogleLogin/bin/GoogleLogin.pdb create mode 100644 GoogleLogin/footer.aspx create mode 100644 GoogleLogin/footer.aspx.cs create mode 100644 GoogleLogin/footer.aspx.designer.cs create mode 100644 GoogleLogin/header.aspx create mode 100644 GoogleLogin/header.aspx.cs create mode 100644 GoogleLogin/header.aspx.designer.cs create mode 100644 GoogleLogin/login.aspx create mode 100644 GoogleLogin/login.aspx.cs create mode 100644 GoogleLogin/login.aspx.designer.cs create mode 100644 GoogleLogin/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs create mode 100644 GoogleLogin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 GoogleLogin/obj/Debug/GoogleLogin.csproj.FileListAbsolute.txt create mode 100644 GoogleLogin/obj/Debug/GoogleLogin.csprojAssemblyReference.cache create mode 100644 GoogleLogin/obj/Debug/GoogleLogin.csprojResolveAssemblyReference.cache create mode 100644 GoogleLogin/obj/Debug/GoogleLogin.dll create mode 100644 GoogleLogin/obj/Debug/GoogleLogin.pdb create mode 100644 GoogleLogin/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs create mode 100644 GoogleLogin/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs create mode 100644 GoogleLogin/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs create mode 100644 GoogleLogin/scripts.js create mode 100644 GoogleLogin/style.css diff --git a/GoogleLogin.sln b/GoogleLogin.sln new file mode 100644 index 0000000..733c898 --- /dev/null +++ b/GoogleLogin.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Web +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoogleLogin", "GoogleLogin\GoogleLogin.csproj", "{5F0B1F6D-BAE4-4C26-B704-34CF840A387A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5F0B1F6D-BAE4-4C26-B704-34CF840A387A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F0B1F6D-BAE4-4C26-B704-34CF840A387A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F0B1F6D-BAE4-4C26-B704-34CF840A387A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F0B1F6D-BAE4-4C26-B704-34CF840A387A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/GoogleLogin/GoogleLogin.csproj b/GoogleLogin/GoogleLogin.csproj new file mode 100644 index 0000000..7320fbe --- /dev/null +++ b/GoogleLogin/GoogleLogin.csproj @@ -0,0 +1,131 @@ + + + + + Debug + AnyCPU + + + 2.0 + {5F0B1F6D-BAE4-4C26-B704-34CF840A387A} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + GoogleLogin + GoogleLogin + v4.5 + true + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + header.aspx + ASPXCodeBehind + + + header.aspx + + + login.aspx + ASPXCodeBehind + + + login.aspx + + + + footer.aspx + ASPXCodeBehind + + + footer.aspx + + + + + Web.config + + + Web.config + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 0 + / + http://localhost:50002/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/GoogleLogin/GoogleLogin.csproj.user b/GoogleLogin/GoogleLogin.csproj.user new file mode 100644 index 0000000..3f8536e --- /dev/null +++ b/GoogleLogin/GoogleLogin.csproj.user @@ -0,0 +1,31 @@ + + + + Debug|Any CPU + + + + + + + + CurrentPage + True + False + False + False + + + + + + + + + False + True + + + + + \ No newline at end of file diff --git a/GoogleLogin/Properties/AssemblyInfo.cs b/GoogleLogin/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c6d12c3 --- /dev/null +++ b/GoogleLogin/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GoogleLogin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GoogleLogin")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c912d57c-9055-4ff4-a6d7-917cf96ef38a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GoogleLogin/Web.Debug.config b/GoogleLogin/Web.Debug.config new file mode 100644 index 0000000..2e302f9 --- /dev/null +++ b/GoogleLogin/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/GoogleLogin/Web.Release.config b/GoogleLogin/Web.Release.config new file mode 100644 index 0000000..c358444 --- /dev/null +++ b/GoogleLogin/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/GoogleLogin/Web.config b/GoogleLogin/Web.config new file mode 100644 index 0000000..6da78ec --- /dev/null +++ b/GoogleLogin/Web.config @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/GoogleLogin/bin/GoogleLogin.dll b/GoogleLogin/bin/GoogleLogin.dll new file mode 100644 index 0000000000000000000000000000000000000000..c5e45d8f6d72e983a11489cf6f21a8a26e392a6b GIT binary patch literal 10240 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 Yem*WtX#TzS#hNww=Ogf6M9CTW9|KV?3jhEB literal 0 HcmV?d00001 diff --git a/GoogleLogin/bin/GoogleLogin.pdb b/GoogleLogin/bin/GoogleLogin.pdb new file mode 100644 index 0000000000000000000000000000000000000000..3da1260822d93920280ad4e7b991e9ee13d4fa83 GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/GoogleLogin/footer.aspx b/GoogleLogin/footer.aspx new file mode 100644 index 0000000..3aae533 --- /dev/null +++ b/GoogleLogin/footer.aspx @@ -0,0 +1,27 @@ +
+ +
+ + <% } %> + +
+ + <% + string path = @"C:\certs\"; + + if (hasWriteAccessToFolder(path)) + { + Response.Write("
Access to " + path + " appears to be okay, but " + + "check permissions if certificate caching doesn't work.
"); + } + else + { + Response.Write("
Access to " + path + " is not verified. Check permissions on that folder!
"); + } + %> +
+ \ No newline at end of file diff --git a/GoogleLogin/footer.aspx.cs b/GoogleLogin/footer.aspx.cs new file mode 100644 index 0000000..6a6d2cd --- /dev/null +++ b/GoogleLogin/footer.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace GoogleLogin +{ + public partial class WebForm1 : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/GoogleLogin/footer.aspx.designer.cs b/GoogleLogin/footer.aspx.designer.cs new file mode 100644 index 0000000..0ab8836 --- /dev/null +++ b/GoogleLogin/footer.aspx.designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GoogleLogin +{ + + + public partial class WebForm1 + { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/GoogleLogin/header.aspx b/GoogleLogin/header.aspx new file mode 100644 index 0000000..05a31df --- /dev/null +++ b/GoogleLogin/header.aspx @@ -0,0 +1,94 @@ +

Google OAuth2 Demonstration v1.0

+

+ This is an example application implementing Google OAuth2 authentication for a C# web application. + This software is provided AS IS by A Better Geek and is solely for testing purposes. Please remember + to test all code thoroughly in your own application before moving to production. +

+

+ Some notes: +

+
    +
  • When viewing the source code of this ASPX page, please focus on the code between the "SAMPLE CODE" commented lines.
  • +
  • Click the "Delete Cookies" button when you're done testing, or to reset your saved client ID and client secret.
  • +
  • The code behind page is heavily commented to aid in your own understanding of the authentication process.
  • +
  • For your reference, this sample project is based on the following A Better Geek articles: + +
  • +
+
+ <% if (Request.Cookies["client_id"] == null && Request.Form["client_id"] == null && Session["loggedin"] != "yes") { %> +

+ You are seeing this message because you have not configured the application yet. Setting the below + parameters will create local browser cookies storing each parameter. In order to protect your application's + client secret, please remember to clear the cookies for this page when you are done testing! +

+

+ If you haven't already done so, you need to first go to Google's API Console + and create your application. Note down your client id and client secret for use in the below form. + You also need to use the URL of this page, including the port number for localhost, as the redirect URI for + your application. +

+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ + <% } else if (Request.Cookies["client_id"] == null && Request.Form["client_id"] != null) { %> + + <% + //write POSTDATA to cookies + Response.Cookies["client_id"].Value = Request.Form["client_id"]; + Response.Cookies["client_secret"].Value = Request.Form["client_secret"]; + Response.Cookies["redirect_uri"].Value = Request.Form["redirect_uri"]; + + Response.Redirect(Request.Form["redirect_uri"]); + %> + + <% } else { %> \ No newline at end of file diff --git a/GoogleLogin/header.aspx.cs b/GoogleLogin/header.aspx.cs new file mode 100644 index 0000000..a0d6e25 --- /dev/null +++ b/GoogleLogin/header.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace GoogleLogin +{ + public partial class header : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/GoogleLogin/header.aspx.designer.cs b/GoogleLogin/header.aspx.designer.cs new file mode 100644 index 0000000..63c20b9 --- /dev/null +++ b/GoogleLogin/header.aspx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GoogleLogin { + + + public partial class header { + } +} diff --git a/GoogleLogin/login.aspx b/GoogleLogin/login.aspx new file mode 100644 index 0000000..0357993 --- /dev/null +++ b/GoogleLogin/login.aspx @@ -0,0 +1,67 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="GoogleLogin.login" %> +<% + //if the user logs out, this clears the session and reloads the page. + if (Request.QueryString["logout"] == "yes") + { + Session.Clear(); + Response.Redirect("/login.aspx"); + } +%> + + + Google OAuth2 Authentication Demo, by A Better Geek + + + + + + + + <% + string code = Request.QueryString["code"]; + + if (code != null && Session["loggedin"] != "yes") + { + //if there is a "code" value in the querystring and no login session present + //then log in using Google + string client_id = Request.Cookies["client_id"].Value; + string client_secret = Request.Cookies["client_secret"].Value; + string redirect_uri = Request.Cookies["redirect_uri"].Value; + string grant_type = "authorization_code"; + + //the state token in the return URL needs to be verified first. + string gState = Request["state"]; + + if (gState == Convert.ToString(Session["state"])) + { + string gurl = "code=" + code + "&client_id=" + client_id + + "&client_secret=" + client_secret + "&redirect_uri=" + redirect_uri + "&grant_type=" + grant_type; + Response.Write(GoogleLogin(gurl)); + + } + else + { + Response.Write("
Please start over. If you're seeing this message, the session ID verification failed.
"); + } + } + else if (Session["loggedin"] == "yes") + { + Response.Write("
Already logged in. You can logout if you'd like.
"); + } + else + { + %> +

+ & + response_type=code&scope=openid%20email&state=<%=Session["state"]%>& + redirect_uri=<%=Request.Cookies["redirect_uri"].Value%>">Login With Google +

+ <% + Response.Write("
Not logged in.
"); + } + %> + + + + + \ No newline at end of file diff --git a/GoogleLogin/login.aspx.cs b/GoogleLogin/login.aspx.cs new file mode 100644 index 0000000..360cb43 --- /dev/null +++ b/GoogleLogin/login.aspx.cs @@ -0,0 +1,304 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +//these are additional libraries needed beyond the default ones +//Reference: http://blog.abettergeek.com/?p=472#part2 +using System.IO; +using System.Net; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Web.Script.Serialization; + +namespace GoogleLogin +{ + public partial class login : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + //when the page loads, a random session token needs to be created + //this will be sent to Google to verify that the data hasn't been tampered with + + //create a random GUID as a token for preventing CSS attacks + //this only happens if a session doesn't already exist + if (Session["state"] == null) + { + Session["state"] = Guid.NewGuid(); + } + } + + public string GoogleLogin(string e) + { + string responseData = ""; + + try + { + // variables to store parameter values + string url = "https://accounts.google.com/o/oauth2/token"; + + // creates the post data for the POST request + string postData = (e); + + // create the POST request + HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); + webRequest.Method = "POST"; + webRequest.ContentType = "application/x-www-form-urlencoded"; + webRequest.ContentLength = postData.Length; + + // POST the data + using (StreamWriter requestWriter2 = new StreamWriter(webRequest.GetRequestStream())) + { + requestWriter2.Write(postData); + } + + //This actually does the request and gets the response back + HttpWebResponse resp = (HttpWebResponse)webRequest.GetResponse(); + + string googleAuth; + + using (StreamReader responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream())) + { + //dumps the HTML from the response into a string variable + googleAuth = responseReader.ReadToEnd(); + } + + //now that we have the responseData (which is a JSON array), we can do stuff with it. + + //process JSON array + JavaScriptSerializer js = new JavaScriptSerializer(); + gLoginInfo gli = js.Deserialize(googleAuth); + + //the id_token is what needs to be decoded to (a) verify it and (b) get some basic details about the user + //gli.id_token is in three parts. the first two are Base64 encoded plaintext. + string[] tokenArray = gli.id_token.Split(new Char[] { '.' }); + + //tokenArray[0] is the JSON header + //tokenArray[1] is the JSON payload + //tokenArray[2] is an encrypted digital signature + + //process header + JavaScriptSerializer js1 = new JavaScriptSerializer(); + gLoginHeader glh = js1.Deserialize(base64Decode(tokenArray[0])); + + //verify signature based on header data - the signature is tokenArray[2] + //we need the keyID, which is glh.kid + + + //use header data to validate signature + //if the signature is valid, we can process the payload + //once the payload is processed, we can either add a new user or log in an existing user + + if (verifySignature(glh.kid, tokenArray)) + { + //process payload + JavaScriptSerializer js2 = new JavaScriptSerializer(); + gLoginClaims glc = js2.Deserialize(base64Decode(tokenArray[1])); + + + //we can tell the session that we're logged in + Session["loggedin"] = "yes"; + responseData = "
You have successfully logged in using " + glc.email + + ". You can logout if you'd like.
"; + } + + } + catch (Exception ex) + { + //this shouldn't ever happen. + responseData = "
ERROR" + ex.StackTrace + "
"; + } + + return responseData; + } + + public class gLoginInfo + { + public string access_token, token_type, id_token; + public int expires_in; + } + + public class gTokenInfo + { + public string issuer, issued_to, audience, user_id, email, email_verified; + public int expires_in, issued_at; + } + + public class gLoginHeader + { + public string alg, kid; + } + + public class gLoginClaims + { + public string aud, iss, email_verified, at_hash, azp, email, sub; + public int exp, iat; + } + + public string base64Decode(string data) + { + //add padding with '=' to string to accommodate C# Base64 requirements + int strlen = data.Length + (4 - (data.Length % 4)); + char pad = '='; + string datapad; + + if (strlen == (data.Length + 4)) + { + datapad = data; + } + else + { + datapad = data.PadRight(strlen, pad); + } + + try + { + System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding(); + System.Text.Decoder utf8Decode = encoder.GetDecoder(); + + // create byte array to store Base64 string + byte[] todecode_byte = Convert.FromBase64String(datapad); + int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); + char[] decoded_char = new char[charCount]; + utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); + string result = new String(decoded_char); + return result; + } + catch (Exception e) + { + throw new Exception("Error in base64Decode: " + e.Message); + } + } + + public byte[] base64urldecode(string arg) + { + //this swaps out the characters in Base64Url encoding for valid Base64 syntax + //C# can't decode Base64 without doing this first + arg = arg.Replace('-', '+'); + arg = arg.Replace('_', '/'); + + int strlen = arg.Length + (4 - (arg.Length % 4)); + char pad = '='; + + if (strlen != (arg.Length + 4)) + { + arg = arg.PadRight(strlen, pad); + } + + //return the Base64 decoded data as a byte array, since that's what we need for RSA + byte[] arg2 = Convert.FromBase64String(arg); + + return arg2; + } + + public bool verifySignature(string kid, string[] jwt) + { + //this will return TRUE if the signature is valid or FALSE if it is invalid + //if the signature is invalid, we must not accept the user's login information! + + //by default, the signature isn't valid, just as a precaution + bool verified = false; + + //pull out the different elements from the original JWT provided by Google + string toVerify = jwt[0] + "." + jwt[1]; + string signature = jwt[2]; + + //the JWS is encoded in Base64 that C# doesn't like + //we need to replace some special characters and then Base64Decode this into a byte array + byte[] sig = base64urldecode(signature); + + //the header and payload need to be converted to a byte array + byte[] data = Encoding.UTF8.GetBytes(toVerify); + + //before we do anything else, we need to locally cache Google's public certificate, if it isn't already + cacheCertificate(kid); + + //now we can validate the signature against our locally-cached certificate + //create an X509 cert from the google certificate in local cache + X509Certificate gcert = X509Certificate.CreateFromCertFile(@"C:\certs\" + kid + ".cer"); + + //we need to use the new X509Certificate2 subclass in order to pull the public key from the certificate + X509Certificate2 gcert2 = new X509Certificate2(gcert); + + //this lets us use the public key from the cached Google certificate + using (var rsa = (RSACryptoServiceProvider)gcert2.PublicKey.Key) + { + //create a new byte array that contains a SHA256 hash of the JSON header and payload + byte[] hash; + using (SHA256 sha256 = SHA256.Create()) + { + hash = sha256.ComputeHash(data); + } + + //Create an RSAPKCS1SignatureDeformatter object and pass it the + //RSACryptoServiceProvider to transfer the key information. + RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(rsa); + RSADeformatter.SetHashAlgorithm("SHA256"); + + //Verify the hash and return the appropriate bool value + if (RSADeformatter.VerifySignature(hash, sig)) + { + verified = true; + } + else + { + verified = false; + } + } + + return verified; + } + + public void cacheCertificate(string kid) + { + //if the certificate ID doesn't already exist as a local certificate file, download it from Google + if (!File.Exists(@"C:\certs\" + kid + ".cer")) + { + //pull JSON certificate data from Google + string url = "https://www.googleapis.com/oauth2/v1/certs"; + WebRequest request = WebRequest.Create(url); + WebResponse response = request.GetResponse(); + Stream certdata = response.GetResponseStream(); + + string certs; + + using (StreamReader sr = new StreamReader(certdata)) + { + certs = sr.ReadToEnd(); + } + + //certs are returned as a JSON object + JavaScriptSerializer js = new JavaScriptSerializer(); + + //convert the JSON object into a dictionary + //pick the certificate that matches the returned key ID from Google + Dictionary cts = js.Deserialize>(certs); + string b64 = cts[kid]; + + //write the certificate to a file with the .cer extension, which identifies it as a digital certificate + //these are stored outside the web server filespace + //at some point the server needs to have a daily script running that deletes certificates that are more than 48 hours old + System.IO.File.WriteAllText(@"C:\certs\" + kid + ".cer", b64); + } + } + + //This is just for testing that your configuration allows write access to the folder where cached certificates are stored. + //You don't need this in your own project. + public bool hasWriteAccessToFolder(string folderPath) + { + try + { + // Attempt to get a list of security permissions from the folder. + // This will raise an exception if the path is read only or do not have access to view the permissions. + System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath); + return true; + } + catch (UnauthorizedAccessException) + { + return false; + } + } + } +} \ No newline at end of file diff --git a/GoogleLogin/login.aspx.designer.cs b/GoogleLogin/login.aspx.designer.cs new file mode 100644 index 0000000..fd69899 --- /dev/null +++ b/GoogleLogin/login.aspx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GoogleLogin { + + + public partial class login { + } +} diff --git a/GoogleLogin/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/GoogleLogin/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs new file mode 100644 index 0000000..e5dc9b8 --- /dev/null +++ b/GoogleLogin/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] diff --git a/GoogleLogin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/GoogleLogin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..f4b76916765bf6c463cdffa32fe16777ea95ebd6 GIT binary patch literal 8255 zcmeHMdruoj5Vr$dFbOTDX&%s|PMfw#>R#;t;gM1WFr+9CAsZ!?Fe2-_v02!=z3%P- zF6FcI6IA_(?aUb;&!iRcN%_NvJU;d@znR(D^~`K4ol2$t!H2%-xq1nS`;t3KYFRh- zYpz2kDkgNfv=^l3Nq@Ptn9scirMdKHi$%LYfBD=(C`_ne)`!q2Ci1zJuqL?k9Ga_g z8~oW?VXQt;pR5;)?nHr&u|9&FdI!>c$c0OI%f106gExu=0Vuo7)UqFhM&H26x0n!e z7u-3m!K;bp;+_GYq|$>pdO`Yi-dN%St~<!-S2N}q3ox_f?eiR(bHCIOzFc<5-Ot%)m2I-s>wb0|GG zs1v%};S_Mop>Mbchf_{-YFSBJm#iMkN~L;`UP`Ca7JiWa*;i?510FgZu9{=WjqGRO zgW`_;0!{F?xVHA5A?W9?nFwKparO35JhWmI_Z#_~ryZ#TuO022@&CPXCMVg1Gx4}M zJvI)7sp<9n`{ejYMNPsE>zy_0N6s#t?z(6aUKH=9B$$8XKGoq3)OFA#e5mW7o%-Qi zr{FfzgJdAnORs%IFcwHJQlGQLmrlq@&IP1x2 zNDvPY0+NF$DTcoujmT;b5h_RyYLSXdf#Mn}pmsR@W|D&6BWjo&DxHXPL4dWfXak&p z&LcES7Me8t0b#skVMi;gwf(^V}w{h#I0lzPk2fZ z@e=fuUp*12^$20=$*Dy!FS!33Vf9ip-c2F9DP%{BrJb(8L`lvDmYzM`x1ss((7&ueFZTOp=fpm!FtlkodaFMfyXWozsG{h2X5_1aICY7ulVW{o4MByjF# zsn8K2OyEoJ65eQ~spt_^LXL})rYgvp)-07p=*d!Pgrv15k=)#0IQNR}z?#C|;r(B@ zZ|JURN#TtiZk+>b8rw(qSI@scY93fK*x!k2%M;`?xL;e literal 0 HcmV?d00001 diff --git a/GoogleLogin/obj/Debug/GoogleLogin.csproj.FileListAbsolute.txt b/GoogleLogin/obj/Debug/GoogleLogin.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..a99593d --- /dev/null +++ b/GoogleLogin/obj/Debug/GoogleLogin.csproj.FileListAbsolute.txt @@ -0,0 +1,5 @@ +K:\Development\bitfork\project\GoogleLogin\GoogleLogin\bin\GoogleLogin.dll +K:\Development\bitfork\project\GoogleLogin\GoogleLogin\bin\GoogleLogin.pdb +K:\Development\bitfork\project\GoogleLogin\GoogleLogin\obj\Debug\GoogleLogin.csprojResolveAssemblyReference.cache +K:\Development\bitfork\project\GoogleLogin\GoogleLogin\obj\Debug\GoogleLogin.dll +K:\Development\bitfork\project\GoogleLogin\GoogleLogin\obj\Debug\GoogleLogin.pdb diff --git a/GoogleLogin/obj/Debug/GoogleLogin.csprojAssemblyReference.cache b/GoogleLogin/obj/Debug/GoogleLogin.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..bc7d262e64bce4c66cde9376a8eacd10c950fafb GIT binary patch literal 22074 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 bV4G0Ew&{UwLWSF=hqehTz&1UyOcOr=zYx?x literal 0 HcmV?d00001 diff --git a/GoogleLogin/obj/Debug/GoogleLogin.dll b/GoogleLogin/obj/Debug/GoogleLogin.dll new file mode 100644 index 0000000000000000000000000000000000000000..c5e45d8f6d72e983a11489cf6f21a8a26e392a6b GIT binary patch literal 10240 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 Yem*WtX#TzS#hNww=Ogf6M9CTW9|KV?3jhEB literal 0 HcmV?d00001 diff --git a/GoogleLogin/obj/Debug/GoogleLogin.pdb b/GoogleLogin/obj/Debug/GoogleLogin.pdb new file mode 100644 index 0000000000000000000000000000000000000000..3da1260822d93920280ad4e7b991e9ee13d4fa83 GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/GoogleLogin/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/GoogleLogin/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/GoogleLogin/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/GoogleLogin/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/GoogleLogin/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/GoogleLogin/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/GoogleLogin/scripts.js b/GoogleLogin/scripts.js new file mode 100644 index 0000000..343fabf --- /dev/null +++ b/GoogleLogin/scripts.js @@ -0,0 +1,28 @@ +function validateForm() { + var inputs = document.getElementsByTagName("input"); + var list = ""; + + for (i = 0; i < inputs.length; i++) { + if (inputs[i].value == "") { + list = list + inputs[i].id + " must be completed.\n"; + } + } + + if (list != "") { + alert(list); + return false; + } + + return true; +} + +function deleteAllCookies() { + var cookies = document.cookie.split(";"); + + for (var i = 0; i < cookies.length; i++) { + var cookie = cookies[i]; + var eqPos = cookie.indexOf("="); + var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; + document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; + } +} \ No newline at end of file diff --git a/GoogleLogin/style.css b/GoogleLogin/style.css new file mode 100644 index 0000000..a3bd07a --- /dev/null +++ b/GoogleLogin/style.css @@ -0,0 +1,74 @@ +BODY { + margin-left: 25%; + width: 50%; + font-family: Calibri, sans-serif; +} +UL { + margin-top: -.75em; + font-size: .8em; +} +UL LI { + padding: .25em 0; +} +UL UL { + margin-top: 0em; + font-size: 1em; +} +FORM#setCookies { + overflow: hidden; + width: 400px; + margin: auto; +} +.row { + clear: both; +} +.label, .input, .submit { + height: 25px; + float: left; +} +.label { + width: 100px; + padding-right: 5px; + line-height: 25px; + text-align: right; + font-size: .8em; +} +.input, .submit { + width: 250px; +} +.input INPUT { + width: 100%; + font-family: Calibri, sans-serif; +} +.submit { + text-align: center; +} +.alert, .good, .bad { + clear: both; + margin: 1em 0.5em; + padding: 5px; + background: #ff9; + border: 1px dotted #f90; + font-size: .8em; + font-style: italic; + color: #c60; +} +.good, .bad { + font-style: normal +} +.good { + background: #cfc; + border-color: #0c3; + color: #060; +} +.bad { + background: #fcc; + border-color: #f00; + color: #900; +} +.footer { + text-align: center; + font-size: .8em; + font-style: italic; + color: #666; +} \ No newline at end of file diff --git a/README.md b/README.md index 121af94..e01fd9c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ -# DotNetOAuth2 +# .NET OAuth2 -A secure implementation of OAuth2 using vanilla ASP.NET C#. Requires no third-party libraries or assemblies. \ No newline at end of file +A secure implementation of OAuth2 using vanilla ASP.NET C#. Requires no third-party libraries or assemblies. + +**This is proof-of-concept and was developed in September 2013. I do not recommend implementing this code in a production environment without careful evaluation of the security implications.** + +This project implements [OAuth2](https://oauth.net/2/), which is a standardized means of implementing third-party authentication for web applications. Securing user accounts is a serious endeavor that requires an adequate understanding of the complex security concerns around protecting users' authentication and identification information. OAuth2 (and its predecessor, OpenID) attempts to address this scenario, by making it easy for web developers to support authentication from a variety of popular online services, such as Google, Microsoft, Twitter, and Facebook. This project uses Google authentication. + +My implementation relies exclusively on vanilla .NET Framework 4.5 assemblies. Although this project implements Google authentication, it should be trivial to modify the code to use other OAuth2 providers. + +For a detailed breakdown of the code, check out the [wiki](/ABG/DotNetOAuth2/wiki). \ No newline at end of file