首页 > 编程语言 >ASP.NET Core 6 使用IdentityServer实现简单的Policy与Role授权

ASP.NET Core 6 使用IdentityServer实现简单的Policy与Role授权

时间:2022-08-31 23:22:25浏览次数:78  
标签:Core ASP WebApp 代码 Role IdentityServer new public IdentityServer4

.Net的OpenId Connect和OAuth 2.0协议实现的框架最新版是Duende.IdentityServer,用于公司要收费(最便宜1500USD一年可以授权管理5个客户端,每增加一个客户端就要加300USD),用于个人免费(年收入低于100W美元的公司也可以申请免费使用)。这里我们为了省去一些麻烦就使用之前的免费版本(IdentityServer4)来做演示,两者的代码差异不大,你用IdentityServer4也可以升级为Duende.IdentityServer,升级参考链接IdentityServer4 v4.1 to Duende IdentityServer v6

首先创建一个Web项目,我这里创建一个空的Web项目,项目名称为IdentityServer用于管理验证和授权。

接下来添加IdentityServer4的Nuget包,然后去GitHub把官方演示程序整个下载下来Github链接,我们把wwwroot、Quickstart、Views三个文件夹复制到我们的项目里,然后在改写一下Program文件的代码。

这里多了一个Config文件,内容如下:

using IdentityServer4.Models;

namespace IdentityServer
{
    public class Config
    {
        public static IEnumerable<ApiScope> ApiScopes => new List<ApiScope>
        {
        };

        public static IEnumerable<Client> Clients => new List<Client>
        {
        };

        public static IEnumerable<IdentityResource> IdentityResources => new List<IdentityResource>
        {
        };
    }
}

接下来我们再添加一个webApp项目并添加Microsoft.AspNetCore.Authentication.OpenIdConnect的Nuget包,改写Program文件代码如下:

配置项里的Authority就是需要跳转到OpenId Connect的授权服务地址,ClientId可以理解为用户名,Client Secret可以理解为密码。

我们在WebApp项目的HomeController打个[Authorize],然后浏览器打开WebApp的地址会跳转到IdentityServer项目的错误页面。

这个错误表示还没给IdentityServer项目配置Client,我们来配置一下,修改Config文件,代码如下:

using IdentityServer4;
using IdentityServer4.Models;

namespace IdentityServer
{
    public class Config
    {
        public static IEnumerable<ApiScope> ApiScopes => new List<ApiScope>
        {
        };

        public static IEnumerable<Client> Clients => new List<Client>
        {
            new Client
            {
                ClientId = "webapp",
                ClientSecrets = { new Secret("secret".Sha256()) },
                AllowedGrantTypes = GrantTypes.Code,
                RedirectUris = { "https://localhost:44381/signin-oidc" },
                PostLogoutRedirectUris = { "https://localhost:44381/signout-callback-oidc" },
                AllowedScopes =
                {
                     IdentityServerConstants.StandardScopes.OpenId,
                     IdentityServerConstants.StandardScopes.Profile,
                }

            }
        };

        public static IEnumerable<IdentityResource> IdentityResources => new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile()
        };
    }
}

这时在浏览WebApp项目就会跳转到登录页面,用户名密码都是bob,登录后就会跳转到首页。bob这个用户是写死在TestUsers这个文件的可以自行修改。

接下来我们修改一下WebApp项目的Home/Index文件,修改后如下

@using Microsoft.AspNetCore.Authentication

@{
    ViewData["Title"] = "Home Page";
}

<div style="word-wrap:break-word;">
    <h2>Cliams</h2>
    <dl>
        @foreach (var claim in User.Claims)
        {
            <dt>@claim.Type</dt>
            <dd>@claim.Value</dd>
        }
    </dl>
    <h2>Properties</h2>
    <dl>
        @foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items)
        {
            <dt>@prop.Key</dt>
            <dd>@prop.Value</dd>
        }
    </dl>
</div>

在新建一个Account控制器,增加一个Action,退出登录用,代码如下

using Microsoft.AspNetCore.Mvc;

namespace Example.WebApp.Controllers
{
    public class AccountController : Controller
    {
        public IActionResult Logout()
        {
            return SignOut("Cookies", "oidc");
        }
    }
}

在修改一下_Layout页面新增一个退出功能:

现在我们登录会看到WebApp首页多了一些数据,但是Claim有些名称显示的太长了看着不友好,我们修改代码调整一下:

在WebApp项目的Program文件添加JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear()这句代码Claim就会显示短名称了。需要引用System.IdentityModel.Tokens.Jwt命名空间。

using System.IdentityModel.Tokens.Jwt;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

.......

最简单的示例代码已经写完了,现在的验证场景有些单一,假设现在有个报表页面,只能给中国用户展示,我们继续来改下代码,WebApp的Program文件改动如下

IdentityServer的Config文件改动如下

记得TestUsers里的bob用户要加上new Claim("country", "China"),另一个用户不用加,以便验证权限。

WebApp项目HomeController新增如下代码

        [Authorize(Policy = "Area.China")]
        public IActionResult Report()
        {
            return Content("<h1>很棒的业绩报表</h1>", "text/html; charset=utf-8");
        }

AccountController新增

public IActionResult AccessDenied(string returnUrl)
        {
            return Content("<h1>您没有权限</h1>", "text/html; charset=utf-8");
        }

现在我们测试一下授权策略是否生效,用bob用户登录后访问/Home/Report

用Alice用户登录访问/Home/Report

顺便说一下,如果要在页面使用类似[Authorize(Policy = "Area.China")]的方法判断权限需要用以下这种方式

var authorizationService = HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
var isPass = authorizationService.AuthorizeAsync(User, "Area.China").Result.Succeeded;

好了,功能已经实现,使用起来还是非常灵活,这里授权除了可以用Policy模式也可以用原生的Role模式,只需要把Role Claim映射一下就可以用User.IsInRole("Admin")这种自带方法判断是否有权限访问某个功能了。

标签:Core,ASP,WebApp,代码,Role,IdentityServer,new,public,IdentityServer4
From: https://www.cnblogs.com/Ax0ne/p/16644232.html

相关文章

  • Filters in ASP.NET Core(Net6之过滤器)
    FiltersinASP.NETCore如果觉得样式不好:跳转即可(md文件复制过来有些样式会不一样)原文地址:https://lifengying.site/archives/net6%E4%B9%8B%E8%BF%87%E6%BB%A4%E5%99......
  • gdb:产生core文件
    转载地址:https://blog.csdn.net/jiemashizhen/article/details/125016646 core文件是调试段错误的重要手段,默认情况下是不会生成core文件的,可通过如下方式对生成core文......
  • CentOS yum 段错误 (core dumped)解决方法
    CentOSyum段错误(coredumped)解决方法_RedHat/Centos_操作系统_脚本之家 https://www.jb51.net/os/RedHat/208481.html今天在yuminstall或者yumupdate的时候都提......
  • .net core上传https的post接口
    如果采用之前的HttpWebRequest方法是实现https的请求,会报错无法建立SSL连接换一种读取方式参考地址1,https://blog.csdn.net/shanghaibao123/article/details/124116749......
  • MTK-coredump 工具的使用
    传音AD9项目报告的内存泄漏问题,家里的内存测试方式比较难以复现,所以想和传音测试对齐,使用同种的测试方式来复现问题-------------使用工具---------------mtkcoredump......
  • .Net Core调试Liunx
    场景:之前做.netcore项目,只能本机调试测试完,发布后放在liunx上。但这个时候经常会因为环境问题,配置问题等,导致程序出现莫名其妙的bug,有的日志还记录的不完善,很难找到......
  • 【Push Kit】有没有接口可以获取手机安装的HMS core apk版本
    ​问题描述:希望在代码中能够获取到HMSCoreAPK的版本,方便获取到线上信息,帮助定位错误 解决办法://方法一:返回int如:660312inthmsVersionCode=HMSPackageManager.......
  • 【HMS core】【FAQ】音频编辑服务、推送服务、AR Engine典型问题合集
    ​1、【HMScore】【音频编辑服务】【问题描述】检查网络没问题,但音频编辑sdk空间渲染功能报错,错误码1007 【原因分析】根据日志打印信息来看,是在点击“空间渲染”功......
  • VUE3.0+Antdv+Asp.net WebApi开发学生信息管理系统(完)
    在B/S系统开发中,前后端分离开发设计已成为一种标准,而VUE作为前端三大主流框架之一,越来越受到大家的青睐,Antdv是Antd在Vue中的实现。本系列文章主要通过Antdv和Asp.netWebA......
  • 用metasploit映射公网远程控制舍友电脑
    用metasploit映射公网远程控制舍友电脑Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评......