Ejemplo n.º 1
0
        public async Task <IActionResult> Login(
            string Username,
            string Password,
            string RedirectUrl,
            [FromServices] JoyOIUC UC)
        {
            var authorizeResult = await UC.TrustedAuthorizeAsync(Username, Password);

            if (authorizeResult.succeeded)
            {
                var profileResult = await UC.GetUserProfileAsync(authorizeResult.data.open_id, authorizeResult.data.access_token);

                User user = await UserManager.FindByNameAsync(Username);

                if (user == null)
                {
                    user = new User
                    {
                        Id          = authorizeResult.data.open_id,
                        UserName    = Username,
                        Email       = profileResult.data.email,
                        PhoneNumber = profileResult.data.phone,
                        SiteName    = profileResult.data.nickname,
                        Template    = "Default",
                        AccessToken = authorizeResult.data.access_token,
                        ExpireTime  = authorizeResult.data.expire_time,
                        OpenId      = authorizeResult.data.open_id,
                        AvatarUrl   = UC.GetAvatarUrl(authorizeResult.data.open_id)
                    };

                    await UserManager.CreateAsync(user, Password);
                }

                if (authorizeResult.data.is_root)
                {
                    await UserManager.AddToRoleAsync(user, "Root");
                }

                var username = (await UC.GetUsernameAsync(authorizeResult.data.open_id, authorizeResult.data.access_token)).data;
                var domain   = string.Format(Configuration["Host:DomainTemplate"], username);
                if (!DB.DomainBindings.Any(x => x.Domain == domain))
                {
                    DB.DomainBindings.Add(new DomainBinding
                    {
                        Domain = domain,
                        UserId = authorizeResult.data.open_id
                    });
                    DB.SaveChanges();
                }

                await SignInManager.SignInAsync(user, true);

                if (!string.IsNullOrWhiteSpace(RedirectUrl))
                {
                    return(Redirect(RedirectUrl));
                }
                else
                {
                    return(RedirectToAction("Index"));
                }
            }
            else
            {
                return(Prompt(x =>
                {
                    x.Title = SR["Sign in failed"];
                    x.Details = authorizeResult.msg;
                    x.StatusCode = authorizeResult.code;
                }));
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> PutSession([FromServices] JoyOIUC UC, CancellationToken token)
        {
            var login           = JsonConvert.DeserializeObject <Login>(RequestBody);
            var authorizeResult = await UC.TrustedAuthorizeAsync(login.Username, login.Password);

            if (authorizeResult.succeeded)
            {
                var profileResult = await UC.GetUserProfileAsync(authorizeResult.data.open_id, authorizeResult.data.access_token);

                User user = await UserManager.FindByNameAsync(login.Username);

                if (user == null)
                {
                    user = new User
                    {
                        Id          = authorizeResult.data.open_id,
                        UserName    = login.Username,
                        Email       = profileResult.data.email,
                        PhoneNumber = profileResult.data.phone,
                        AccessToken = authorizeResult.data.access_token,
                        ExpireTime  = authorizeResult.data.expire_time,
                        OpenId      = authorizeResult.data.open_id,
                        AvatarUrl   = UC.GetAvatarUrl(authorizeResult.data.open_id)
                    };

                    await UserManager.CreateAsync(user, login.Password);
                }

                var roles = await UserManager.GetRolesAsync(user);

                if (authorizeResult.data.is_root)
                {
                    if (!roles.Any(x => x == "Root"))
                    {
                        await UserManager.AddToRoleAsync(user, "Root");
                    }
                }
                else
                {
                    if (roles.Any(x => x == "Root"))
                    {
                        await UserManager.RemoveFromRoleAsync(user, "Root");
                    }
                }

                await SignInManager.SignInAsync(user, true);

                user.LastLoginTime = DateTime.Now;
                DB.SaveChanges();

                var cookie = HttpContext.Response.Headers["Set-Cookie"].ToString();
                var expire = DateTime.Parse(CookieExpireRegex.Match(cookie).Value).ToTimeStamp();

                return(Result <dynamic>(new
                {
                    Cookie = cookie
                             .Replace(" httponly", "")
                             .Replace("samesite=lax", "")
                             .Replace("path=/;", ""),
                    Expire = expire
                }));
            }
            else
            {
                return(Result(400, authorizeResult.msg));
            }
        }