NetCore 基于identity的登录验证授权机制
2021-03-07 21:27
标签:com 判断 mic container common eth 高手 没有 sed 十年河东,十年河西,莫欺少年穷 学无止境,精益求精 本篇探讨下基于NetCore_2.1版本的登录验证授权机制, 学过MVC的童鞋们都知道,Form验证中,MVC中采用的是FormTicket的验证授权机制,那么在NetCore中怎么实现登录验证授权呢? 其实我们在Asp.Net Core项目中的认证,也是比较简单的。现在我们就通过构建一个小项目来一步步来探讨,并最终实现NetCore的登录验证及授权。 1、新建一个解决方案(NetCoreAuth),该解决方案中包含五个项目,如下: 1.1、项目NetCoreAuth是一个MVC项目,通过VS直接创建即可,我们称之为:UI层 1.2、项目NetCoreInterface是接口层,我们都知道NetCore通过依赖注入来进行代码解耦,因此,接口层是必不可少的 1.3、项目NetCoreService是实现接口的服务层,用于依赖注入时,构建和接口的映射关系,也是必不可少的一层 1.4、项目NetCoreModels是一个Model层,一般项目中,用来构建数据DTO,因此,可以说也是必不可少的一层 1.5、项目NetCoreCommon是一个公共方法层,用于存放通用类,通用枚举,静态变量等 2、项目构建完毕后,我们先来完善除NetCoreAuth层(UI层)之外的代码 2.1、项目NetCoreCommon层很简单,只有一个类,用于作返回值用的,如下: 2.2、项目NetCoreInterface层只有一个接口,用于登录接口,如下: 2.3.项目NetCoreService层实现接口层,因此也只有一个登录方法,如下: 2.4、项目NetCoreModels层只有一个实体类,用于当用户登录成功后,返回当前登录用户的基本信息,并赋值给这个实体类。其作用是: 在项目编码过程中,我们可随时通过帮助类,读取当前登录人的信息,当然,在此案例中,我并没有实现通过帮助类读取当前登录人信息这个功能。~_~ 以上便是上述四个项目的代码实现,是不是很简单呢? 然而,我们今天探讨的重点不是上述代码,而是基于identity的登录验证授权机制 我们仔细剖析登录验证授权这六个字,其重点是最后的两个字:授权。 登录验证无非是用户在登录页登录,服务器结合数据库进行账户密码校验,一旦验证通过,我们怎么对当前用户进行授权呢? 针对授权我的理解为:用户通过登录验证后,系统分配一个票据给登录用户,用户在一定的时间内,带着这个票据进行系统访问,系统根据当前登录人所带的票据,判断该用户是否有权限访问相关资源(结合数据库权限表中分配的资源及相关数据权限功能权限) 那么,授权怎么实现呢?如下: 3、完善项目中的 Startup 类,如下: 3.1、在Startup类ConfigureServices方法中添加服务 3.2、在Startup类Configure方法中注册授权认证中间件,如下: 3.3、整个Startup类如下: 4、相关控制器及视图代码 4.1、核心代码,用于登录用户授权,如下: 4.2、登录方法中引用一个ViewModel,如下: 4.3、登录页面如下: 页面只是简单的做了实现,HTML编码如下: 通过HTML编码中的JS方法,我们知道,用户登录授权后,会跳转至/Home/Index 那么,在Home/Index页面中,我们如何判断当前用户是否通过登录验证授权? 如下: 继承自BaseController,代码如下: 方法 OnActionExecuting 在基类视图方法运行之前执行,因此,在基类视图呈现之前,我们有必须判断登录人携带的凭据。 当然,高手也可以通过过滤器或者自定义中间件来判断携带的凭据是否合法。 @天才卧龙的博客 NetCore 基于identity的登录验证授权机制 标签:com 判断 mic container common eth 高手 没有 sed 原文地址:https://www.cnblogs.com/chenwolong/p/identity.htmlnamespace NetCoreCommon
{
public class BaseResponse
{
public BaseResponse()
{
this.isSuccess = false;
this.resultCode = -1;
this.resultMessage = "请求失败...";
}
///
public interface IAdminService
{
UserInfoModel CheckAccountAndPassword(string Account,string Password);
}
public class AdminService: IAdminService
{
///
public class UserInfoModel
{
public string userId { get; set; } = Guid.NewGuid().ToString();
public string userSex { get; set; } = "男";
public string userPhone { get; set; } = "18137070152";
public string userAccount { get; set; } = "chenwolong";
public string userName { get; set; } = "陈卧龙";
public string userCompany { get; set; } = "盟拓软件(苏州)有限公司";
public string userRole { get; set; } = "SuperAdmin";
/*
等等其他属性
*/
}#region 在Start.cs类中,添加服务
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
{
o.Cookie.Name = "_AdminTicketCookie";
o.LoginPath = new PathString("/Account/Login");
o.LogoutPath = new PathString("/Account/LoginOut");
o.AccessDeniedPath = new PathString("/Error/Forbidden");
o.ExpireTimeSpan = TimeSpan.FromHours(4);//4小时后 Ticket过期
});
services.AddTransient
#region 添加授权中间件
app.UseAuthentication();//添加授权认证中间件
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NetCoreInterface;
using NetCoreService;
namespace NetCoreAuth
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure
public class AccountController : Controller
{
public IAdminService _AdminService;
public ILoggerFactory _Logger;
public AccountController(IAdminService Service, ILoggerFactory LoggerService)
{
_AdminService = Service;
_Logger = LoggerService;
}
public IActionResult Login()
{
return View();
}
///
namespace NetCoreAuth.Models
{
public class LoginViewModel
{
[Required(AllowEmptyStrings =false,ErrorMessage ="用户名为必填项")]
[RegularExpression(@"^[A-Z]+[a-zA-Z""‘\s-]*$",ErrorMessage ="用户名必须包含字母大小写")]
public string Account { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "用户登录密码为必填项")]
[MinLength(6,ErrorMessage ="密码最小长度为6位")]
public string Password { get; set; }
}
}
@{
Layout = null;
}
DOCTYPE html>
html>
head>
meta name="viewport" content="width=device-width" />
title>Logintitle>
script src="~/lib/jquery/dist/jquery.js">script>
script type="text/javascript">
function Login() {
var Account = $("#Account").val();
var Password = $("#Password").val();
var UserData = {
Account: Account,
Password: Password
};
$.post("/Account/UserLogin", UserData, function (result) {
if (result.isSuccess) {
window.location.href = "/home/index";
}
else {
alert(result.resultMessage)
}
});
}
script>
head>
body>
div>用户名:input id="Account" name="Account" type="text" />div>
div>密码:input id="Password" name="Password" type="text" />div>
div>
input id="Button1" type="button" onclick="Login()" value="登录" />
div>
body>
html>
public class BaseController : Controller
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var data = context.HttpContext.User;
//没有通过登录验证授权
if (data.Identity.IsAuthenticated == false)
{
Response.Redirect("/Account/Login");
}
}
}
文章标题:NetCore 基于identity的登录验证授权机制
文章链接:http://soscw.com/index.php/essay/61506.html