www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势

admin 2个月前 (07-18) 科技 48 1

前言

IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架

IdentityServer4方文档:https://identityserver4.readthedocs.io/

看这篇文章前默认你对IdentityServer4 已经有一些领会。

本篇使用IdentityServer4的4.X版本,跟老版本的稍微有些差异。下面直接进入正题。

鉴权中央

建立IdentityServer4项目

使用IdentityServer4 来搭建一个鉴权中央,首先建议安装一下IdentityServer4的官方项目模板。也可以不安装,自己建立项目,然后NuGet安装需要的包也行。(不外照样推荐用官方的模板,很利便)。

命令行执行:dotnet new -i IdentityServer4.Templates

安装完成后会多出以下项目模板:

我这里选用is4inmem这个模板来建立项目,这个模板的数据都是写死在内存中的,而且包罗了Quickstart页面,对照简朴利便。

来到我的项目目录下执行:dotnet new is4inmem --name Idp

执行完成会天生以下文件:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第1张

VS2019打开项目:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第2张

运行项目:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第3张

设置ApiResource、ApiScope、Clients

修改Startup:

// in-memory, code confIG
builder.AddInMemoryIdentityResources(Config.IdentityResources);
builder.AddInMemoryApiScopes(Config.ApiScopes);
//添加API资源
builder.AddInMemoryApiResources(Config.ApiResources);
builder.AddInMemoryClients(Config.Clients);

这里比之前版本多了一个添加ApiScopes的方式:

builder.AddInMemoryApiScopes(Config.ApiScopes);

由于我接下来有要珍爱的API资源,以是需要添加一行:

builder.AddInMemoryApiResources(Config.ApiResources);

Config中的代码:

public static class Config
{
    public static IEnumerABLe<IdentityResource> IdentityResources =>
        new IdentityResource[]
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile(),
        };

    public static IEnumerable<ApiScope> ApiScopes =>
        new ApiScope[]
        {
            new ApiScope("scope1"),
            //new ApiScope("scope2"),
        };

    public static IEnumerable<ApiResource> ApiResources =>
        new ApiResource[]
        {
            new ApiResource("api1","#api1")
            {
                //!!!主要
                Scopes = { "scope1"}
            },
            //new ApiResource("api2","#api2")
            //{
            //    //!!!主要
            //    Scopes = { "scope2"}
            //},
        };

    public static IEnumerable<Client> Clients =>
        new Client[]
        {
            new Client
            {
                ClientId = "postman client",
                ClientName = "Client Credentials Client",

                AllowedGrantTypes = GrantTypes.ClientCredentials,
                ClientSecrets = { new Secret("postman secret".Sha256()) },

                AllowedScopes = { "scope1" }
            },
        };
}

我添加了一个ID为postman client的客户端,授权模式就用最简朴的ClientCredentials客户端模式。需要注重的是4.x版本的ApiScope和ApiResource是离开设置的,然后在ApiResource中一定要添加Scopes。若是你在网上搜的IdentityServer4教程对照老的,都是没有这个ApiScope的,默认ApiResource的Name作为Scope。类似这样:

public static IEnumerable<ApiResource> ApiResources =>
        new ApiResource[]
        {
            new ApiResource("api1","#api1"),//错误
            new ApiResource("api2","#api2"),//错误
        };


public static IEnumerable<Client> Clients =>
        new Client[]
        {
            new Client
            {
                ......

                AllowedScopes = { "api1", "api2" }
            },
        };

若是你这么写的话,虽然不影响你获取token,然则你接见api资源的话,永远会获得一个401错误!!!

ApiResource

下面添加一个api1资源,新建asp.netcore web应用并使用webapi模板:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第4张

NuGet安装:Microsoft.AspNetCore.Authentication.JWtBearer

Startup部门代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AdDControllers();

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AdDJwtBearer(options =>
        {
            //IdentityServer地址
            options.Authority = "http://localhost:5001";
            //对应Idp中ApiResource的Name
            options.Audience = "api1";
            //不使用https
 		    options.RequireHttpsMetadata = false;
        });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicatioNBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    //身份验证
    app.UseAuthentication();

    //授权
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MaPControllers();
    });
}

给WeatherForecastController添加[Authorize]符号:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第5张

运行Api1Resource,用postman测试接见weatherforecast接口:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第6张

此时获得401错误。下面先去Idp获取一个token:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第7张

拿到token后再去接见weatherforecast就没问题了:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第8张

进行到这里,似乎跟scope都没什么关系,那么scope到底有什么用处呢?

ApiScope计谋授权

继续修改代码。

Api1Resource项目NuGet安装:IdentityServer4.AccessTokenValidation

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第9张

再新建一个TestController用于区分:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第10张

下面我需要做的是使用scope连系计谋授权来划分限制TestController和WeatherForecastController的接见权限。

修改Startup:

public void ConfigureServices(IServiceCollection services)
{
    ......

    services.AddAuthorization(options =>
    {
        //基于计谋授权
        options.AddPolicy("WeatherPolicy", builder =>
        {
            //客户端Scope中包罗api1.weather.scope才气接见
            builder.RequireScope("api1.weather.scope");
        });
        //基于计谋授权
        options.AddPolicy("TestPolicy", builder =>
        {
            //客户端Scope中包罗api1.test.scope才气接见
            builder.RequireScope("api1.test.scope");
        });
    });
}

为了好明白,我把scope名称划分改成了:api1.weather.scope和api1.test.scope。

WeatherForecastController的Authorize符号修改一下:[Authorize(Policy = "WeatherPolicy")]

TestController的代码很简朴:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第11张

由于修改了scope名称,需要把Idp中的scope名称也改一下:

public static IEnumerable<ApiScope> ApiScopes =>
    new ApiScope[]
    {
        new ApiScope("api1.weather.scope"),
        new ApiScope("api1.test.scope"),
        //new ApiScope("scope2"),
    };

public static IEnumerable<ApiResource> ApiResources =>
    new ApiResource[]
    {
        new ApiResource("api1","#api1")
        {
            //!!!主要
            Scopes = { "api1.weather.scope", "api1.test.scope" }
        },
        //new ApiResource("api2","#api2")
        //{
        //    //!!!主要
        //    Scopes = { "scope2"}
        //},
    };

客户端界说,AllowedScopes暂时只给一个api1.weather.scope测试一下

public static IEnumerable<Client> Clients =>
            new Client[]
            {
                new Client
                {
                    ClientId = "postman client",
                    ClientName = "Client Credentials Client",

                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    ClientSecrets = { new Secret("postman secret".Sha256()) },

                    AllowedScopes = { "api1.weather.scope" }
                },
            };

postman获取token:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第12张

接见weatherforecast接口,正常响应200。

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第13张

再接见test,获得403错误:

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第14张

接下来修改一下Idp的客户端界说,添加api1.test.scope:

AllowedScopes = { "api1.weather.scope", "api1.test.scope" }

修改Idp后一定要重新获取token,jwt就是这样,一旦天生就无法改变。

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第15张

拿到新的token后接见test和weatherforecast,这时候就都可以正常响应了。

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第16张

www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势  第17张

总结

以上使用IdentityServer4搭建了一个鉴权中央,珍爱API资源,并使用ApiScope配合计谋授权完成了一个简朴的权限控制。IdentityServer4的玩法异常多,知识点也许多。强烈推荐B站的@solenovex 杨先生的视频,地址:https://www.bilibili.com/video/BV16b411k7yM 多看几遍,会有收获。。。

需要代码的点这里:https://github.com/xiajingren/IdentityServer4-4.x-Scope-Demo

,

欧博官网

欢迎进入欧博官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:www.px111.net:IdentityServer4 4.x版本 设置Scope的准确姿势

网友评论

  • (*)

最新评论

  • Allbet注册 2020-07-18 00:06:43 回复

    欧博Allbet欢迎进入欧博Allbet官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我轻轻地来了

    1

标签列表

    文章归档

      站点信息

      • 文章总数:653
      • 页面总数:0
      • 分类总数:8
      • 标签总数:1146
      • 评论总数:283
      • 浏览总数:17261