完成用户登录、登出、修改密码
This commit is contained in:
		
							parent
							
								
									b8e59f524a
								
							
						
					
					
						commit
						791f7d48f3
					
				@ -1,25 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using FAuth.Models;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 用户控制器
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class AppController:ControllerBase<AppController>
 | 
			
		||||
    {
 | 
			
		||||
        public AppController(ILogger<AppController> logger,IServiceProvider service) : base(logger,service) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IActionResult Index() {
 | 
			
		||||
            return PartialView();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,9 +1,11 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Falcon.Extend;
 | 
			
		||||
using FAuth.DataBase;
 | 
			
		||||
using FAuth.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Microsoft.Extensions.Options;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers
 | 
			
		||||
{
 | 
			
		||||
@ -29,6 +31,10 @@ namespace FAuth.Controllers
 | 
			
		||||
        /// 数据缓冲
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public ICacheProvider Cache { get; set; }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Cookie中定义的键
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public CookieKeyDefine CookieKeys { get; set; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 通过日志组件和服务集合生成控制器
 | 
			
		||||
@ -40,6 +46,7 @@ namespace FAuth.Controllers
 | 
			
		||||
            this.Services = service;
 | 
			
		||||
            this.Db = service.GetService<FAuthDb>();
 | 
			
		||||
            this.Cache = service.GetService<ICacheProvider>();
 | 
			
		||||
            this.CookieKeys = Services.GetService<IOptions<CookieKeyDefine>>().Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,9 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using FAuth.Extensions;
 | 
			
		||||
using FAuth.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Filters;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers.api
 | 
			
		||||
@ -10,7 +11,9 @@ namespace FAuth.Controllers.api
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// api控制器基类
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    [ApiController, Route("api/[Controller]/[Action]")]
 | 
			
		||||
    [Area("api")]
 | 
			
		||||
    //[ApiController]
 | 
			
		||||
    [Route("api/[Controller]/[Action]")]
 | 
			
		||||
    [ServiceFilter(typeof(ApiExceptionFilterAttribute))]
 | 
			
		||||
    [ProducesResponseType(typeof(ApiErrorResult),500)]
 | 
			
		||||
    [ProducesResponseType(typeof(ApiErrorResult),400)]
 | 
			
		||||
@ -18,5 +21,9 @@ namespace FAuth.Controllers.api
 | 
			
		||||
    {
 | 
			
		||||
        public ApiControllerBase(ILogger<LoggerType> logger,IServiceProvider service) : base(logger,service) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //public override Task OnActionExecutionAsync(ActionExecutingContext context,ActionExecutionDelegate next) {
 | 
			
		||||
        //    return base.OnActionExecutionAsync(context,next);
 | 
			
		||||
        //}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,14 +1,14 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Routing;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Falcon.Extend;
 | 
			
		||||
using FAuth.DataBase;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Falcon.Extend;
 | 
			
		||||
using FAuth.DataBase.Tables;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using FAuth.Extensions;
 | 
			
		||||
using FAuth.Extensions.Account;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers.api
 | 
			
		||||
{
 | 
			
		||||
@ -17,7 +17,10 @@ namespace FAuth.Controllers.api
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class AppController:ApiControllerBase<AppController>
 | 
			
		||||
    {
 | 
			
		||||
        public AccountHelper Account { get; set; }
 | 
			
		||||
 | 
			
		||||
        public AppController(ILogger<AppController> logger,IServiceProvider service) : base(logger,service) {
 | 
			
		||||
            this.Account = this.Services.GetService<AccountHelper>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@ -81,6 +84,21 @@ namespace FAuth.Controllers.api
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 通过管理员凭据获取应用列表
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="adminTicket">管理员凭据</param>
 | 
			
		||||
        /// <returns>应用列表</returns>
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
        [ProducesResponseType(typeof(IEquatable<Apps>),200)]
 | 
			
		||||
        public IEnumerable<Apps> GetAppList(string adminTicket) {
 | 
			
		||||
            if(this.Account.IsNotSystemAdmin(adminTicket)) {
 | 
			
		||||
                throw new ApiException("需要提供管理员票据");
 | 
			
		||||
            }
 | 
			
		||||
            var qu = this.Db.Apps;
 | 
			
		||||
            return qu.ToList();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -89,7 +89,7 @@ namespace FAuth.Controllers.api
 | 
			
		||||
        /// <returns>用户信息</returns>
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
        [ProducesResponseType(typeof(UserInfo),200)]
 | 
			
		||||
        public UserInfo GetUserByTicket([BindRequired]string ticket) {
 | 
			
		||||
        public UserInfo GetUserByTicket(string ticket) {
 | 
			
		||||
            if(ticket.IsNullOrEmpty()) {
 | 
			
		||||
                throw new ApiArgumentNullException(nameof(ticket));
 | 
			
		||||
            }
 | 
			
		||||
@ -106,6 +106,7 @@ namespace FAuth.Controllers.api
 | 
			
		||||
                Id = fir.Id,
 | 
			
		||||
                LastLoginDatetime = fir.LastLoginDatetime,
 | 
			
		||||
                UserName = fir.UserName,
 | 
			
		||||
                Name = fir.Name,
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										0
									
								
								FAuth/Controllers/web/AppController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								FAuth/Controllers/web/AppController.cs
									
									
									
									
									
										Normal file
									
								
							@ -7,12 +7,12 @@ using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using FAuth.Models;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers
 | 
			
		||||
namespace FAuth.Controllers.web
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Home控制器
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class HomeController:ControllerBase<HomeController>
 | 
			
		||||
    public class HomeController:WebControllerBase<HomeController>
 | 
			
		||||
    {
 | 
			
		||||
        public HomeController(ILogger<HomeController> logger,IServiceProvider service) : base(logger,service) {
 | 
			
		||||
        }
 | 
			
		||||
@ -6,13 +6,17 @@ using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using FAuth.Models;
 | 
			
		||||
using FAuth.Extensions;
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using api = FAuth.Controllers.api;
 | 
			
		||||
using Falcon.Extend;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers
 | 
			
		||||
namespace FAuth.Controllers.web
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 用户控制器
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class UserController:ControllerBase<UserController>
 | 
			
		||||
    public class UserController:WebControllerBase<UserController>
 | 
			
		||||
    {
 | 
			
		||||
        public UserController(ILogger<UserController> logger,IServiceProvider service) : base(logger,service) {
 | 
			
		||||
        }
 | 
			
		||||
@ -21,5 +25,12 @@ namespace FAuth.Controllers
 | 
			
		||||
            return PartialView();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IActionResult Login() {
 | 
			
		||||
            return PartialView();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IActionResult ResetPassword() {
 | 
			
		||||
            return PartialView();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								FAuth/Controllers/web/WebControllerBase.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								FAuth/Controllers/web/WebControllerBase.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Controllers.web
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Web页面控制器基类
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <typeparam name="LoggerType"></typeparam>
 | 
			
		||||
    //[Area("web"), Route("web/[Controller]/[Action]")]
 | 
			
		||||
    public abstract class WebControllerBase<LoggerType>:ControllerBase<LoggerType>
 | 
			
		||||
    {
 | 
			
		||||
        public WebControllerBase(ILogger<LoggerType> logger,IServiceProvider service) : base(logger,service) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										79
									
								
								FAuth/Extensions/CookieHelper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								FAuth/Extensions/CookieHelper.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,79 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Microsoft.AspNetCore.CookiePolicy;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Extensions
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// cookie帮助类
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public static class CookieHelper
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 设置Cookie值
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="httpContext">http上下文</param>
 | 
			
		||||
        /// <param name="key">Cookie的键</param>
 | 
			
		||||
        /// <param name="value">cookie值</param>
 | 
			
		||||
        /// <param name="minutes">cookie有效期。分钟,无限传null或不传</param>
 | 
			
		||||
        public static void SetCookies(this HttpContext httpContext,string key,string value,int? minutes = null) {
 | 
			
		||||
            SetCookies(httpContext.Response,key,value,minutes);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 设置Cookie值
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="response">http响应</param>
 | 
			
		||||
        /// <param name="key">Cookie的键</param>
 | 
			
		||||
        /// <param name="value">cookie值</param>
 | 
			
		||||
        /// <param name="minutes">cookie有效期。分钟,无限传null或不传</param>
 | 
			
		||||
        public static void SetCookies(this HttpResponse response,string key,string value,int? minutes = null) {
 | 
			
		||||
            if(minutes.HasValue) {
 | 
			
		||||
                response.Cookies.Append(key,value,new CookieOptions {
 | 
			
		||||
                    Expires = DateTime.Now.AddMinutes(minutes.Value)
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                response.Cookies.Append(key,value);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 删除cookie
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="httpContext">http上下文</param>
 | 
			
		||||
        /// <param name="key">要删除的键</param>
 | 
			
		||||
        public static void DeleteCookies(this HttpContext httpContext,string key) {
 | 
			
		||||
            DeleteCookies(httpContext.Response,key);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 删除cookie
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="response">http响应</param>
 | 
			
		||||
        /// <param name="key">要删除的键</param>
 | 
			
		||||
        public static void DeleteCookies(this HttpResponse response,string key) {
 | 
			
		||||
            response.Cookies.Delete(key);
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 获取cookie中的值
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="httpContext">http上下文</param>
 | 
			
		||||
        /// <param name="key">cookie的键</param>
 | 
			
		||||
        /// <returns>保存的值</returns>
 | 
			
		||||
        public static string GetCookiesValue(this HttpContext httpContext,string key) {
 | 
			
		||||
            return GetCookiesValue(httpContext.Request,key);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 获取cookie中的值
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="request">http请求</param>
 | 
			
		||||
        /// <param name="key">cookie的键</param>
 | 
			
		||||
        /// <returns>保存的值</returns>
 | 
			
		||||
        public static string GetCookiesValue(this HttpRequest request,string key) {
 | 
			
		||||
            if(request.Cookies.TryGetValue(key,out string value)) {
 | 
			
		||||
                return value;
 | 
			
		||||
            }
 | 
			
		||||
            return string.Empty;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -7,6 +7,7 @@
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="Falcon.Extend" Version="1.2.1" />
 | 
			
		||||
    <PackageReference Include="jquery.cookie" Version="1.4.1" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.3" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="3.1.3" />
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								FAuth/Models/CookieKeyDefine.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								FAuth/Models/CookieKeyDefine.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
using Microsoft.Extensions.Options;
 | 
			
		||||
 | 
			
		||||
namespace FAuth.Models
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Cookie中使用的键定义
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class CookieKeyDefine:IOptions<CookieKeyDefine>
 | 
			
		||||
    {
 | 
			
		||||
        public CookieKeyDefine Value => this;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 保存用户凭据的键
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string UserKey { get; set; } = "_userCK";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -19,6 +19,10 @@ namespace FAuth.Models
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string UserName { get; set; }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 用户名
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 上次登录时间
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public DateTimeOffset? LastLoginDatetime { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ using FAuth.DataBase;
 | 
			
		||||
using FAuth.Extensions;
 | 
			
		||||
using FAuth.Extensions.Account;
 | 
			
		||||
using FAuth.Extensions.Decryptor;
 | 
			
		||||
using FAuth.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Builder;
 | 
			
		||||
using Microsoft.AspNetCore.Hosting;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
@ -85,6 +86,8 @@ namespace FAuth
 | 
			
		||||
            services.AddUserTicketDryptor(UTDO);
 | 
			
		||||
            //注册api错误处理器
 | 
			
		||||
            services.AddScoped<ApiExceptionFilterAttribute>();
 | 
			
		||||
            //×¢²áCookie¼üÅäÖÃ
 | 
			
		||||
            services.Configure<CookieKeyDefine>(this.Configuration.GetSection("CookieKeyDefine"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
@{
 | 
			
		||||
    ViewBag.Title = "首页";
 | 
			
		||||
    ViewBag.Title = "统一登录平台";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
<div class="text-center">
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,6 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
@using Microsoft.Extensions.Options
 | 
			
		||||
@inject IOptions<CookieKeyDefine> CKD
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
@ -30,8 +32,21 @@
 | 
			
		||||
                        <li class="nav-item">
 | 
			
		||||
                            <a class="nav-link text-dark" fajax-updata="main" asp-controller="User" asp-action="Index">用户管理</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        <li class="nav-item">
 | 
			
		||||
                            <a class="nav-link text-dark" target="_blank" href="/api">接口文档</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    </ul>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div id="userBar">
 | 
			
		||||
                    <div id="login">
 | 
			
		||||
                        <a asp-controller="user" asp-action="login" fajax-updata="main">登录</a>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div id="logout">
 | 
			
		||||
                        <span>欢迎: <span id="userName"></span></span>
 | 
			
		||||
                        <a asp-controller="user" asp-action="ResetPassword" fajax-updata="main">修改密码</a>
 | 
			
		||||
                        <a href="#" id="logOut">退出</a>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </nav>
 | 
			
		||||
    </header>
 | 
			
		||||
@ -47,9 +62,58 @@
 | 
			
		||||
        </div>
 | 
			
		||||
    </footer>
 | 
			
		||||
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
 | 
			
		||||
    <script src="~/lib/jquery.cookie/jquery.cookie-1.4.1.min.js"></script>
 | 
			
		||||
    <script src="~/lib/jquery.unobtrusive-ajax/jquery.unobtrusive-ajax.min.js"></script>
 | 
			
		||||
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
 | 
			
		||||
    <script src="~/js/site.js" asp-append-version="true"></script>
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
 | 
			
		||||
        //设置用户key
 | 
			
		||||
        myJs.userKey="@CKD.Value.UserKey";
 | 
			
		||||
 | 
			
		||||
        //刷新用户条
 | 
			
		||||
        function RefreshUserBar() {
 | 
			
		||||
            var ticket =myJs.getTicket();
 | 
			
		||||
            if (!ticket) {
 | 
			
		||||
                $("#logout").hide();
 | 
			
		||||
                $("#login").show();
 | 
			
		||||
            }
 | 
			
		||||
            if (ticket) {
 | 
			
		||||
                var url = "/api/User/GetUserByTicket";
 | 
			
		||||
                var data = { ticket: ticket };
 | 
			
		||||
                myJs.get(url, data, function (d) {
 | 
			
		||||
                    $("#userName").html(d.Name);
 | 
			
		||||
                    $("#logout").show();
 | 
			
		||||
                    $("#login").hide();
 | 
			
		||||
                }, function (c,i,m) {
 | 
			
		||||
                        $("#logout").hide();
 | 
			
		||||
                        $("#login").show();
 | 
			
		||||
                        myJs.msg(m);
 | 
			
		||||
                        myJs.removeTicket();
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function logOut() {
 | 
			
		||||
            var ticket = myJs.getTicket();
 | 
			
		||||
            var url = "/api/User/Logout";
 | 
			
		||||
            var data = { ticket: ticket };
 | 
			
		||||
            myJs.post(url, data, function (d) {
 | 
			
		||||
                myJs.removeTicket(ticket);
 | 
			
		||||
                RefreshUserBar();
 | 
			
		||||
            }, function (s,i,m) {
 | 
			
		||||
                    myJs.msg(m);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        $(function () {
 | 
			
		||||
            RefreshUserBar();
 | 
			
		||||
 | 
			
		||||
            $("#logOut").click(function () {
 | 
			
		||||
                logOut();
 | 
			
		||||
                return false;
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    </script>
 | 
			
		||||
    @RenderSection("Scripts",required: false)
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								FAuth/Views/User/Login.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								FAuth/Views/User/Login.cshtml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
@inject IOptions<CookieKeyDefine> CKD
 | 
			
		||||
 | 
			
		||||
<div id="logInForm">
 | 
			
		||||
    <form fajax-success="loginOnSucc" fajax-failure="loginOnError" method="post" action="/api/User/Login">
 | 
			
		||||
        <label>用户名:<input type="text" name="userName" /></label>
 | 
			
		||||
        <label>密码:<input type="password" name="password" /></label>
 | 
			
		||||
        <input type="submit" value="登录" />
 | 
			
		||||
        <span id="errormsg"></span>
 | 
			
		||||
    </form>
 | 
			
		||||
</div>
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
    function loginOnSucc(d) {
 | 
			
		||||
        var _userKey = "@CKD.Value.UserKey";
 | 
			
		||||
        $.cookie(_userKey, d.Ticket);
 | 
			
		||||
        if (RefreshUserBar) RefreshUserBar();
 | 
			
		||||
        $("#logInForm").hide();
 | 
			
		||||
    }
 | 
			
		||||
    function loginOnError(d) {
 | 
			
		||||
        var msg = d.responseJSON.Message;
 | 
			
		||||
        $("#errormsg").text(msg);
 | 
			
		||||
    }
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										28
									
								
								FAuth/Views/User/ResetPassword.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								FAuth/Views/User/ResetPassword.cshtml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
 | 
			
		||||
<form method="post" id="ResetPasswordForm">
 | 
			
		||||
    <label>新密码:<input type="password" name="np" /></label>
 | 
			
		||||
    <label>再次输入:<input type="password" name="np1" /></label>
 | 
			
		||||
    <input type="button" id="submit" value="提交" />
 | 
			
		||||
    <span id="errMsg"></span>
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
    $(function () {
 | 
			
		||||
        $("#submit").click(function () {
 | 
			
		||||
            debugger;
 | 
			
		||||
            var p1 = $("input[name='np']").val();
 | 
			
		||||
            var p2 = $("input[name='np1']").val();
 | 
			
		||||
            if (p1 != p2) {
 | 
			
		||||
                $("#errMsg").html("两次输入的密码不一致");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            var url = "api/user/changepassword";
 | 
			
		||||
            var ticket = myJs.getTicket();
 | 
			
		||||
            myJs.post(url, { ticket:ticket, nPassword:p1 }, function (d) {
 | 
			
		||||
                $("#ResetPasswordForm").html("<span>修改成功</span>");
 | 
			
		||||
            }, function (s, i, m) {
 | 
			
		||||
                $("#ResetPasswordForm #errMsg").html("<span>" + m + "编号:" + i + "</span>");
 | 
			
		||||
            })
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
</script>
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
@using FAuth
 | 
			
		||||
@using FAuth.Models
 | 
			
		||||
@using Microsoft.Extensions.Options
 | 
			
		||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 | 
			
		||||
@addTagHelper FAuth.Extensions.TagHelpers.*, FAuth
 | 
			
		||||
@ -2,3 +2,44 @@
 | 
			
		||||
// for details on configuring this project to bundle and minify static web assets.
 | 
			
		||||
 | 
			
		||||
// Write your JavaScript code.
 | 
			
		||||
 | 
			
		||||
var myJs = {};
 | 
			
		||||
myJs.get = function (url, data, success, error) {
 | 
			
		||||
    $.ajax({
 | 
			
		||||
        url: url,
 | 
			
		||||
        type: "get",
 | 
			
		||||
        data: data,
 | 
			
		||||
        success: function (d) {
 | 
			
		||||
            success(d);
 | 
			
		||||
        },
 | 
			
		||||
        error: function (d) {
 | 
			
		||||
            error(d.status, d.responseJSON.Id, d.responseJSON.Message)
 | 
			
		||||
        },
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
myJs.post = function (url, data, success, error) {
 | 
			
		||||
    $.ajax({
 | 
			
		||||
        url: url,
 | 
			
		||||
        type: "post",
 | 
			
		||||
        data: data,
 | 
			
		||||
        success: function (d) {
 | 
			
		||||
            success(d);
 | 
			
		||||
        },
 | 
			
		||||
        error: function (d) {
 | 
			
		||||
            error(d.status, d.responseJSON.Id, d.responseJSON.Message)
 | 
			
		||||
        },
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
myJs.msg = function (msg) {
 | 
			
		||||
    alert(msg);
 | 
			
		||||
}
 | 
			
		||||
//保存用户凭据的键,在_layout视图设置
 | 
			
		||||
myJs.userKey = "";
 | 
			
		||||
//获取登录的用户票据
 | 
			
		||||
myJs.getTicket = function () {
 | 
			
		||||
    return $.cookie(myJs.userKey);
 | 
			
		||||
}
 | 
			
		||||
//移除用户登录票据
 | 
			
		||||
myJs.removeTicket = function () {
 | 
			
		||||
    $.removeCookie(myJs.userKey);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								FAuth/wwwroot/lib/jquery.cookie/jquery.cookie-1.4.1.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								FAuth/wwwroot/lib/jquery.cookie/jquery.cookie-1.4.1.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
/*! jquery.cookie v1.4.1 | MIT */
 | 
			
		||||
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});
 | 
			
		||||
							
								
								
									
										117
									
								
								FAuth/wwwroot/lib/jquery.cookie/jquery.cookie.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								FAuth/wwwroot/lib/jquery.cookie/jquery.cookie.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,117 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * jQuery Cookie Plugin v1.4.1
 | 
			
		||||
 * https://github.com/carhartl/jquery-cookie
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2013 Klaus Hartl
 | 
			
		||||
 * Released under the MIT license
 | 
			
		||||
 */
 | 
			
		||||
(function (factory) {
 | 
			
		||||
	if (typeof define === 'function' && define.amd) {
 | 
			
		||||
		// AMD
 | 
			
		||||
		define(['jquery'], factory);
 | 
			
		||||
	} else if (typeof exports === 'object') {
 | 
			
		||||
		// CommonJS
 | 
			
		||||
		factory(require('jquery'));
 | 
			
		||||
	} else {
 | 
			
		||||
		// Browser globals
 | 
			
		||||
		factory(jQuery);
 | 
			
		||||
	}
 | 
			
		||||
}(function ($) {
 | 
			
		||||
 | 
			
		||||
	var pluses = /\+/g;
 | 
			
		||||
 | 
			
		||||
	function encode(s) {
 | 
			
		||||
		return config.raw ? s : encodeURIComponent(s);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function decode(s) {
 | 
			
		||||
		return config.raw ? s : decodeURIComponent(s);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function stringifyCookieValue(value) {
 | 
			
		||||
		return encode(config.json ? JSON.stringify(value) : String(value));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function parseCookieValue(s) {
 | 
			
		||||
		if (s.indexOf('"') === 0) {
 | 
			
		||||
			// This is a quoted cookie as according to RFC2068, unescape...
 | 
			
		||||
			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			// Replace server-side written pluses with spaces.
 | 
			
		||||
			// If we can't decode the cookie, ignore it, it's unusable.
 | 
			
		||||
			// If we can't parse the cookie, ignore it, it's unusable.
 | 
			
		||||
			s = decodeURIComponent(s.replace(pluses, ' '));
 | 
			
		||||
			return config.json ? JSON.parse(s) : s;
 | 
			
		||||
		} catch(e) {}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function read(s, converter) {
 | 
			
		||||
		var value = config.raw ? s : parseCookieValue(s);
 | 
			
		||||
		return $.isFunction(converter) ? converter(value) : value;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var config = $.cookie = function (key, value, options) {
 | 
			
		||||
 | 
			
		||||
		// Write
 | 
			
		||||
 | 
			
		||||
		if (value !== undefined && !$.isFunction(value)) {
 | 
			
		||||
			options = $.extend({}, config.defaults, options);
 | 
			
		||||
 | 
			
		||||
			if (typeof options.expires === 'number') {
 | 
			
		||||
				var days = options.expires, t = options.expires = new Date();
 | 
			
		||||
				t.setTime(+t + days * 864e+5);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return (document.cookie = [
 | 
			
		||||
				encode(key), '=', stringifyCookieValue(value),
 | 
			
		||||
				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
 | 
			
		||||
				options.path    ? '; path=' + options.path : '',
 | 
			
		||||
				options.domain  ? '; domain=' + options.domain : '',
 | 
			
		||||
				options.secure  ? '; secure' : ''
 | 
			
		||||
			].join(''));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Read
 | 
			
		||||
 | 
			
		||||
		var result = key ? undefined : {};
 | 
			
		||||
 | 
			
		||||
		// To prevent the for loop in the first place assign an empty array
 | 
			
		||||
		// in case there are no cookies at all. Also prevents odd result when
 | 
			
		||||
		// calling $.cookie().
 | 
			
		||||
		var cookies = document.cookie ? document.cookie.split('; ') : [];
 | 
			
		||||
 | 
			
		||||
		for (var i = 0, l = cookies.length; i < l; i++) {
 | 
			
		||||
			var parts = cookies[i].split('=');
 | 
			
		||||
			var name = decode(parts.shift());
 | 
			
		||||
			var cookie = parts.join('=');
 | 
			
		||||
 | 
			
		||||
			if (key && key === name) {
 | 
			
		||||
				// If second argument (value) is a function it's a converter...
 | 
			
		||||
				result = read(cookie, value);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Prevent storing a cookie that we couldn't decode.
 | 
			
		||||
			if (!key && (cookie = read(cookie)) !== undefined) {
 | 
			
		||||
				result[name] = cookie;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return result;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	config.defaults = {};
 | 
			
		||||
 | 
			
		||||
	$.removeCookie = function (key, options) {
 | 
			
		||||
		if ($.cookie(key) === undefined) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Must not alter options, thus extending a fresh object...
 | 
			
		||||
		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
 | 
			
		||||
		return !$.cookie(key);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}));
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user