Esempio n. 1
0
        /// <summary>
        ///     <para>
        /// Registers or logs in a user if their Id can be found.
        ///     </para>
        /// </summary>
        /// <param name="context"></param>
        /// <param name="Redis"></param>
        /// <param name="Settings"></param>
        /// <returns></returns>
        internal static async Task RegisterUser(OAuthCreatingTicketContext context, Startup.Provider LoginProvider /* change this later */, IDatabase Redis, AppSetting Settings)
        {
            // Retrieve user info by passing an Authorization header with the value token {accesstoken};
            var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);

            request.Headers.Authorization = new AuthenticationHeaderValue(LoginProvider.AuthorizationHeader, context.AccessToken);

            // Extract the user info object from the OAuth response
            var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted);

            response.EnsureSuccessStatusCode();
            var oauthres = await response.Content.ReadAsStringAsync();

            if (Settings.Provider == "GitHub")
            {
                var GitHubProvider = new GitHubLoginProvider(Redis, Settings);

                // fetch the OAuth profile from the provider
                var user = await GitHubProvider.GetOAuthProfile(response, context);

                // Create the user from it
                var providerUser = GitHubProvider.CreateUserFromOAuth(user);

                // Register the profile
                var RegisteredUser = GitHubProvider.RegisterUser(providerUser);

                // Add the Name Identifier claim for htmlantiforgery tokens, and the users redis key location.
                context.Identity.AddClaims(
                    new List <Claim> {
                    new Claim(
                        ClaimTypes.NameIdentifier,
                        RegisteredUser.UserId.ToString(),
                        ClaimValueTypes.String,
                        context.Options.ClaimsIssuer
                        ),
                    new Claim(
                        "RedisKey",
                        $"{Settings.Redis.BaseKey}Users:{RegisteredUser.UserId}",
                        ClaimValueTypes.String,
                        context.Options.ClaimsIssuer
                        )
                }
                    );
            }
            else if (Settings.Provider == "Discord")
            {
                throw new NotImplementedException("Discord not really worth it");
                var DiscordProvider = new DiscordLoginProvider(Redis, Settings);
                var a = await DiscordProvider.GetOAuthProfile(response, context);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Refreshes the PublicData hash in redis by making a request to the users GitHub UserProfile Api
        /// </summary>
        /// <param name="GitHubProfileUri"></param>
        /// <returns></returns>
        internal static async Task <PublicUser> RefreshPublicUserProfile(int GitHubProfileId, AppSetting Settings, IDatabase Redis)
        {
            var GitHubProvider = new GitHubLoginProvider(Redis, Settings);

            return(await GitHubProvider.UpdateProviderDetails(GitHubProfileId));
        }