上篇:

最简实例演示asp.net5中用户认证和授权(3)

上面我们把自定义认证和授权的相关的最小基础类和要实现的接口都实现了,下面就是如何来进行认证和授权的配置。

首先我们要告诉系统,我们的用户和角色类以及实现的接口,这样系统在认证的时候就知道要调用哪些类和方法,其实就是注册一下上面定义的几个类而已,在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)的更多相关文章

  1. 最简实例演示asp.net5中用户认证和授权(3)

    上接: 最简实例演示asp.net5中用户认证和授权(2) 在实现了角色的各种管理接口后,下一步就是实现对用户的管理,对用户管理的接口相对多一些,必须要实现的有如下三个: 1 public inter ...

  2. 最简实例演示asp.net5中用户认证和授权(2)

    上接最简实例演示asp.net5中用户认证和授权(1) 基础类建立好后,下一步就要创建对基础类进行操作的类了,也就是实现基础类的增删改查(听起来不太高大上),当然,为了使用asp.net5的认证机制, ...

  3. 最简实例演示asp.net5中用户认证和授权(1)

    asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证 ...

  4. [转]asp.net5中使用NLog进行日志记录

    本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...

  5. asp.net5中使用NLog进行日志记录

    asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...

  6. 【翻译】asp.net core2.1认证和授权解密

    asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...

  7. asp.net core2.1认证和授权解密

    来源:https://www.cnblogs.com/pangjianxin/p/9372562.html asp.net core2.1认证和授权解密 本篇文章翻译自:https://digital ...

  8. springSecurity + jwt + redis 前后端分离用户认证和授权

    记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...

  9. ASP.NET5 中静态文件的各种使用方式

    所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...

随机推荐

  1. 转载:oracle用户创建及权限设置

    权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...

  2. J2EE 工作中注意事项

    [转载于http://www.cnblogs.com/hemingwang0902/archive/2012/01/06/2314215.html] 根据当前项目中代码存在的一些问题,编写了一个编码注 ...

  3. android中如何在系统启动的时候启动自己的service

    自定义一个broadcastreciver在去接受系统启动消息,然后在处理的时候启动自己的service即可

  4. LENOVO服务器批量升级BMC固件

    需求:通过服务器远程管理IP批量升级IMM.UEFI固件 工具:asu64.ipmitool.iflash64.cdc_interface.sh 下载:http://pan.baidu.com/s/1 ...

  5. Syslog+Fluentd+InfluxDB日志收集系统搭建

    环境配置 节点 配置 类型 操作系统 Sched 2G 2CPU 50GB ens3=>192.168.200.11 KVM虚拟机 CentOS 7 Nova 4G 2CPU 50GB ens3 ...

  6. iOS模拟器的应用沙盒在MAC中的位置

    每个iOS应用都有自己专属的应用沙盒.分别为 应用程序包 Documents/ Library/Caches/ Library/Preferences/ tmp/ 当运行模拟时,在MAC下找到对应路径 ...

  7. 历届试题_log大侠

    标题:Log大侠     atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠.     一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... ...

  8. Objective-C对象的申请空间与初始化

    对象分配空间与初始化 对象分配空间与初始化 使用Objective-C语言创建一个对象有两个步骤,你必须: 为新对象动态分配内存空间 初始化新分配的内存,并赋初值 不经过如上两步,一个对象就没有完全功 ...

  9. [转] 出现( linker command failed with exit code 1)错误总结

    这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. ...

  10. Python Day22

    Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 1.创建Form类 ...