上篇:

最简实例演示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. java基础知识(7)---多态

    多 态:(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现.体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat();多态的好处:提高了程序 ...

  2. elasticsearch2.x插件之一:kibana

    介绍: 要说kibana,就不得不先说一下logstash.这里呢,先要讲个故事.故事是开头是这样的,Logstash早期曾经自带了一个特别简单的logstash-web用来查看ES中的数据,其功能太 ...

  3. JSP有哪些动作?

    JSP使用动作来动态的插入文件,实现重定向和对JavaBean的引用等功能.它公有6个基本动作:jsp:include,jsp:useBean,jsp:setProperty,jsp:getPrope ...

  4. Java学习之多态(Polymorphism)

    多态==晚绑定 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); 当使用多态方 ...

  5. ps -ef | grep java 输出的具体含义是什么?

      uid        pid    ppid # PID 这个程序的 ID 下面的 PPID 则是父程序的 ID: PS是LINUX下最常用的也是非常强大的进程查看命令 常见的使用方法是检查一个进 ...

  6. 释放License命令

    lmutil_x86.exe lmremove -c 1055@Vappcloud-WinS acfd Administrator VappCloud_Win7a.vancloud-corp.com ...

  7. js 把字符串变成函数

    js 把字符串变成函数 eval("(" + fieldEventss[1]+")");

  8. 输入类型<input type="number"> / input标签的输入限制

    输入限制 属性 描述 disabled 规定输入字段应该被禁用. max 规定输入字段的最大值. maxlength 规定输入字段的最大字符数. min 规定输入字段的最小值. pattern 规定通 ...

  9. Java实例练习——基于UDP协议的多客户端通信

    昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...

  10. 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

    Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...