最简实例演示asp.net5中用户认证和授权(4)
上篇:
上面我们把自定义认证和授权的相关的最小基础类和要实现的接口都实现了,下面就是如何来进行认证和授权的配置。
首先我们要告诉系统,我们的用户和角色类以及实现的接口,这样系统在认证的时候就知道要调用哪些类和方法,其实就是注册一下上面定义的几个类而已,在Startup.cs文件的ConfigureServices方法添加如下代码:
public void ConfigureServices(IServiceCollection services)
{ ... services.AddIdentity<HDUser, HDRole>();
services.AddSingleton<IUserStore<HDUser>, HDUserStore<HDUser>>();
services.AddSingleton<IRoleStore<HDRole>, HDRoleStore<HDRole>>();
... }
第6行,注册我们定义的用户和角色类。第7行和第8行注册用户和角色操作类。
那么这三行代码有什么关系呢?
我们去看一下AddIdentity的源代码,看看里面都干了什么活:
public static IdentityBuilder AddIdentity<TUser, TRole>(
this IServiceCollection services,
Action<IdentityOptions> setupAction)
where TUser : class
where TRole : class
{
// Services used by identity
services.AddOptions();
services.AddAuthentication(options =>
{
// This is the Default value for ExternalCookieAuthenticationScheme
options.SignInScheme = new IdentityCookieOptions().ExternalCookieAuthenticationScheme;
}); // Identity services
services.TryAddSingleton<IdentityMarkerService>();
services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
// No interface for the error describer so we can add errors without rev'ing the interface
services.TryAddScoped<IdentityErrorDescriber>();
services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
services.TryAddScoped<UserManager<TUser>, UserManager<TUser>>();
services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>();
services.TryAddScoped<RoleManager<TRole>, RoleManager<TRole>>(); if (setupAction != null)
{
services.Configure(setupAction);
} return new IdentityBuilder(typeof(TUser), typeof(TRole), services);
}
原来这货把认证授权需要实现的接口都注册了一遍,光看方法名字确实让人很难想象。
那么后两行是干什么的呢?看一下AddIdentity源代码的26~28行,需要用到usermanger、signinmanager和rolemanager,这几个类里面需要用到IUserStore和IRoleStore,这两行就是注册这两个接口的实现的。
好了,上面是注册的,那么光注册还不行,还要启用才行,咱们再看一下Configure方法,添加如下代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
...
app.UseIdentity();
... }
这样就告诉系统要启用认证这套机制了。
OK。到这里基础工作都做完了。
是不是活都干完了?没有啊,还没有告诉我怎么登录,怎么对网页或方法应用角色权限啊,我们慢慢来。
我们再写一个简单的登录和退出的管理类,假设叫AccountController吧,代码如下:
[Route("account")]
public class AccountController : Controller
{
[FromServices]
public SignInManager<HDUser> SignInManager { get; set; }
[AllowAnonymous]
[HttpGet("login")]
public IActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
[HttpPost("login")]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid == true)
{
var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError("", "用户名或密码错误.");
return View(model);
}
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> LogOff()
{
await SignInManager.SignOutAsync();
return RedirectToAction(nameof(HomeController.Index), "Home");
}
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}
}
这里面最重要的就是Login方法,它根据传入的登录信息,调用SignInManager.PasswordSignInAsync方法,就能完成登录了。等等,这个SignInManager怎么来的?你咋可以直接用呢?看看上面的定义:
[FromServices]
public SignInManager<HDUser> SignInManager { get; set; }
有一个FromServices标记,原来这个是系统自动从服务里面取得的,还记得我们上面调用了一次AddIdentity吗?它就把SignInManager注册到服务里,然后就可以到处使用了,这个可以认为是asp.net5的非常重要的依赖注入机制,也是灵魂之一,如果不明白的,一定要好好看看哦。
好了,我们再看看LoginViewModel,这个也是比较重要的一个参数:
public class LoginViewModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; } [Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; } [Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
不过代码很简单,vs自动生成项目的时候,一般都这么生成登录代码。
有Controler了,是不是还要有View呢,当然要有,不过很简单,就不贴出来了。
最后,我们看一下应用权限的类是什么样的:
[Authorize]
[Route("api/data")]
public class DatasApiController : Controller
{ [HttpGet("daxialist")]
[Authorize(Roles ="user")]
public JsonResult GetDaxiaList()
{ ...
return Json(...);
} [HttpGet("daxiacount")]
public JsonResult GetDaxiaCount()
{
return Json(...);
}
}
这里使用[Authorize]表示要对这个类的所有方法应用权限管理
[Authorize(Roles ="user")]表示这个方法只能角色为user的用户可以访问。
那个GetDaxiaCount方法,没有应用角色,表示所有经过认证的用户都可以访问,不管角色是什么。
至此,我们最终完成了一个最简单的基于asp.net5的认证授权。当然,这里可能连认证授权百分之一的功能都没有体现出来,要想深入了解,还要花大量的时间去研究啊。
最简实例演示asp.net5中用户认证和授权(4)的更多相关文章
- 最简实例演示asp.net5中用户认证和授权(3)
上接: 最简实例演示asp.net5中用户认证和授权(2) 在实现了角色的各种管理接口后,下一步就是实现对用户的管理,对用户管理的接口相对多一些,必须要实现的有如下三个: 1 public inter ...
- 最简实例演示asp.net5中用户认证和授权(2)
上接最简实例演示asp.net5中用户认证和授权(1) 基础类建立好后,下一步就要创建对基础类进行操作的类了,也就是实现基础类的增删改查(听起来不太高大上),当然,为了使用asp.net5的认证机制, ...
- 最简实例演示asp.net5中用户认证和授权(1)
asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证 ...
- [转]asp.net5中使用NLog进行日志记录
本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...
- asp.net5中使用NLog进行日志记录
asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...
- 【翻译】asp.net core2.1认证和授权解密
asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...
- asp.net core2.1认证和授权解密
来源:https://www.cnblogs.com/pangjianxin/p/9372562.html asp.net core2.1认证和授权解密 本篇文章翻译自:https://digital ...
- springSecurity + jwt + redis 前后端分离用户认证和授权
记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...
- ASP.NET5 中静态文件的各种使用方式
所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...
随机推荐
- 使用SVG + CSS实现动态霓虹灯文字效果
效果图: 原理:多个SVG描边动画使用不同的animation-delay即可! 对于一个形状SVG元素或文本SVG元素,可以使用stroke-dasharray来控制描边的间隔样式,并且可以用str ...
- ABCD四个人说真话的概率都是1/3。假如A声称B否认C说D是说谎了,那么D说过的那句话真话的概率是多少
ABCD四个人说真话的概率都是1/3.假如A声称B否认C说D是说谎了,那么D说过的那句话 真话的概率是多少 记"A声称B否认C说D说谎"为X,那么由贝叶斯公式,所求的 P(D真)P ...
- BAT小米奇虎美团迅雷携程等等各大企业校招,笔试面试题。
类似在线测试的方式展示题目. 历年在线笔试试卷: 百度 http://www.nowcoder.com/paper/search?query=%E7%99%BE%E5%BA%A6 腾讯http:// ...
- .NET 中文件嵌套,例如:cshtml文件下面嵌套css和js【机器翻译】
越来越多的我发现自己在我的一些较大的Web项目中丢失了文件.有很多内容要处理 - HTML视图,几个派生CSS页面,页面级CSS,脚本库,应用程序范围的脚本和页面特定的脚本文件等等.幸运的是,我使用R ...
- Protocol Buffers官方文档(开发指南)
本文是对官方文档的翻译,然后截取了一篇非常优秀的文章片段来帮助理解,本人英文水平有限,基本都是直译,如果有不理解的地方请参考英文官方文档,参考的文章链接在文章末尾 protocol buffers简介 ...
- const define区别
可以使用defined()----检测常量是否设置 [问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是 ...
- List<T>的排序
方法一.sort() (1)当list中存的是简单数据类型时: public void Sort(); List<int> a = new List<int>() { 4, 5 ...
- elasticsearch shard 和 replica
(1)index包含多个shard(2)每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的建立索引和处理请求的能力(3)增减节点时,shard会自动在nodes中负载均衡(4) ...
- 树的直径-CF592D Super M
给定一颗n个节点树,边权为1,树上有m个点被标记,问从树上一个点出发,经过所有被标记的点的最短路程(起终点自选).同时输出可能开始的编号最小的那个点.M<=N<=123456. 先想:如果 ...
- nginx丢弃http包体处理
http框架丢弃http请求包体和上一篇文章http框架接收包体, 都是由http框架提供的两个方法,供http各个模块调用,从而决定对包体做什么处理.是选择丢弃还是接收,都是由模块决定的.例如静态资 ...