1.建立   netcore  mvc 项目。

2.startup.cs 中添加服务

 services.AddAuthorization(option=>
{
var requirements = new List<MyPermission>();
requirements.Add(new MyPermission() { Url = "/", Name = "admin" }); // 要有 / 开头
requirements.Add(new MyPermission() { Url = "/home/index", Name = "admin" });
requirements.Add(new MyPermission() { Url = "/default", Name = "root" });
option.AddPolicy("qgbplicy", policy =>
{
policy.Requirements.Add(new PermissionRequirement("/denied", requirements, ClaimTypes.Role));
}); }).AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(
option => {
option.AccessDeniedPath = "/home/Denied";
option.LoginPath = "/home/Login";
}
);
services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
  app.UseAuthentication();

3.登录的controller:

  [AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(string userName, string password, string returnUrl = null)
{ //用户标识
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
//如果是基于角色的授权策略,这里要添加用户
identity.AddClaim(new Claim(ClaimTypes.Name, "gsw"));
//如果是基于角色的授权策略,这里要添加角色
identity.AddClaim(new Claim(ClaimTypes.Role, "admin"));
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
if (returnUrl == null)
{
returnUrl = TempData["returnUrl"]?.ToString();
}
if (returnUrl != null)
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
} }

4.创建 PermissionHandler 类

    public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
//从AuthorizationHandlerContext转成HttpContext,以便取出表求信息
var httpContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext).HttpContext; //是否经过验证
if (httpContext.User.Identity.IsAuthenticated)
{
var questUrl = httpContext.Request.Path.Value.ToLower();
//权限中是否存在请求的url
if (requirement.Permissions.Any(w => w.Url.ToLower() == questUrl))
{
var name = httpContext.User.Claims.SingleOrDefault(s => s.Type == requirement.ClaimType).Value;
//验证权限
if (requirement.Permissions.Any(w => w.Name == name))
{
context.Succeed(requirement);
}
else
{
//无权限跳转到拒绝页面
httpContext.Response.Redirect(requirement.DeniedAction);
}
}
else
{
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}

最新文章

  1. [Android Pro] android控件ListView顶部或者底部也显示分割线
  2. Linux解压和打包jar
  3. react-router
  4. asynchronous-logging-with-log4j-2--转
  5. Why Deep Learning Works – Key Insights and Saddle Points
  6. (转)TextView属性大全
  7. POJ3258River Hopscotch(二分)
  8. poj1080--Human Gene Functions(dp:LCS变形)
  9. fuel 6.1自动推送3控高可用centos 6.5 juno环境排错(一)
  10. 在android C/C++ native编程(ndk)中使用logcat
  11. 凸包问题——Graham Scan
  12. DataFrameNaFunctions无fill方法
  13. jbpm - 工作流的基本操作
  14. springboot配置redis
  15. Linux第三课——目录操作
  16. 用户场景模拟+Spec
  17. kettle Spoon.bat运行闪退
  18. Delphi调用网页美化SQL
  19. UI设计初学者如何避免走弯路?
  20. 分布式事务,EventBus 解决方案:CAP【中文文档】(转)

热门文章

  1. Mac 卸载Python3.6
  2. Angular4.x+Ionic3 踩坑之路之打包时出现JAVASCRIPT HEAP OUT OF MEMORY的几种解决办法
  3. Fegin的使用总结
  4. PHP学习之文件上传类
  5. 操作TreeView(咏南工作室)
  6. nginx使用vhost子目录
  7. python md5验签
  8. [转]MySQL 中 You can&#39;t specify target table &#39;表名&#39; for update in FROM clause错误解决办法
  9. java工具类学习,系统中用户密码加密总结
  10. Ubuntu 14.04安装vim8