ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

前言

网上关于Identity Server4的资料有挺多的,之前是一直看杨旭先生的,最近项目中有使用到,在使用.NET Core3.1的时刻有一些差别。以是在此纪录一下。

准备知识: https://www.cnblogs.com/cgzl/p/9405796.html

本文内容参考

如杨旭先生所说,官方文档真的很详细,有时间建议人人看下官方文档。

确立Authorization Server

确立ASP.Net Core项目使用空模板。

项目确立之后,运行方式改为使用控制台运行而不是IIS Express,以便查看种种debug信息。

这个已成为习惯,也是学习杨先生的,确实对照利便,固然若是不喜欢可以不设置,只需要端口号设置的时刻对应好就可以的。

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1
修改后文件代码为:

{ 
  "profiles": { 
    "IdentityServer4.AuthServer": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

端口号为5000,此时运行程序,会显示出Hello World!,默认的,没有修改。

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

安装Identity Server4

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

点击安装就好啦。

设置Identity Server4

API和客户端

API的设置和之前有所差别,之前是ApiResources,现在分为ApiResourcesApiScopes,后续会说到。

using IdentityServer4.Models;
using IdentityServer4.Test;
using System.Collections.Generic;

namespace IdentityServer4.AuthServer.Configuration
{
    public class InMemoryConfiguration
    {
        /// <summary>
        /// Api Scopes
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<ApiScope> ApiScopes()
        {
            return new List<ApiScope>
            {
                new ApiScope("scope1","scope1")
            };
        }
        /// <summary>
        /// ApiResources
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<ApiResource> ApiResources()
        { 
            return new[]
            {
                new ApiResource
                {
                    Name = "api1",
                    DisplayName = "My Api1",
                    Scopes = { "scope1" }
                } 
            };
        }
        /// <summary>
        /// Clients
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<Client> Clients()
        {
            return new[]
            { 
                new Client
                {
                    ClientId = "client",
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials, 
                    ClientSecrets =
                    {
                        new Secret("secret".Sha256())
                    }, 
                    AllowedScopes = { "scope1" }
                }
            };
        }
        /// <summary>
        /// Users
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<TestUser> Users()
        {
            return new[]
            {
                new TestUser
                {
                    SubjectId = "1",
                    Username = "mail@qq.com",
                    Password = "password"
                }
            };
        }
    }
}

ApiScopes: 这个应该怎么翻译我也不清楚,API局限?若是没明白错的话,就是给之前的ApiResources进行了一个分组。授权的时刻会验证Scope

ApiResources:好比官网的第一个demo,可能会有疑问,你怎么知道我是api1呢?实在,就没有验证,只要有授权码就可以接见的。若是说,我只要api1的话,那就用到ApiResources了,生产环境中,也一定是需要用到的。

加载资源和客户端

修改Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddTestUsers(InMemoryConfiguration.Users().ToList())
        .AddInMemoryClients(InMemoryConfiguration.Clients())
        .AddInMemoryApiScopes(InMemoryConfiguration.ApiScopes())
        .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());
}

固然,也需要app.UseIdentityServer();

首次启动时,Identity Server4将建立一个开发人员署名密钥,该文件名为tempkey.rsa。不必将该文件签入源代码治理中,若是不存在该文件将被重新建立。也就是AddDeveloperSigningCredential()。 这个方式只适合用于Identity Server4在单个机器运行, 若是是生产环境你得使用AddSigningCredential()这个方式.

运行一下,发现并没有什么改变,不外打开:http://localhost:5000/.well-known/openid-configuration,则应该看到所谓的发现文档。发现文档是身份服务器中的尺度端点。客户端和API将使用发现文档来下载需要的设置数据。

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

获取Token

打开Postman,根据设置的输入然后试一下

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

获取到Token,控制台输出如下:

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

Unity安卓共享纹理

这里是有用户的信息的,然则我们可以把用户信息去掉,然后GrantType改为client_credentials,我们设置的是 ResourceOwnerPasswordAndClientCredentials 这个GrantType,以是使用用户名密码以及使用ClientCredentials都可以。

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

不外此时控制台会有区别,没有用户信息了。

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

美化美化UI

Identity Server 4 提供了一套QuickStart UI

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI

此存储库包罗UI所需的控制器,模子,视图和CSS文件。只需下载/克隆并将其复制到Web项目中即可。

打开项目根目录,运行Powershell,然后输入下令:

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/main/getmain.ps1'))

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

不外可能你会遇到我前三次那种错误,嗯,接见不了,那就全局或者先下载下来人工粘贴过去吧~

好了以后我们的项目是酱紫的:

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

由于有wwwroot下许多静态文件, 以是asp.net core 需要启用服务静态文件的功效: 修改Startup的Configure方式

先看修改前的样子吧

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseIdentityServer();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }

修改后

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseIdentityServer();

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                   name: "default",
                   pattern: "{controller=Home}/{action=Index}/{id?}"
               );
            });
        }

是不是抛异常了?

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

由于我们现在有UI了,以是不要忘记在ConfigureServices内里注册MVC。

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

            services.AddIdentityServer()
              .AddDeveloperSigningCredential()
              .AddTestUsers(InMemoryConfiguration.Users().ToList())
              .AddInMemoryClients(InMemoryConfiguration.Clients())
              .AddInMemoryApiScopes(InMemoryConfiguration.ApiScopes())
              .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());
        }

然后运行一下试试:

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

登录一下~

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

好了,现在我们已经可以登录乐成了。

登录界面可以自定义的~,OK,今天就到这里

设计

接下来会说一下

  • 确立我们的API项目并使用Token测试接口
  • 确立一个MVC客户端项目接见我们的API
  • 确立一个JS(Vue)客户端接见我们的API项目

End

推广下自己的民众号一个逗逼的程序员,主要纪录自己工作中解决问题的思绪分享及学习过程中的条记。绝对不会程序员销售程序员的焦虑来割韭菜

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

原创文章,作者:7h28新闻网,如若转载,请注明出处:https://www.7h28.com/archives/22241.html