如果您想了解asp.net-core–ASP.NET核心项目上的WebAPI和IdentityServer和asp.netcore5.0webapi的知识,那么本篇文章将是您的不二之选。我们将深入剖析
如果您想了解asp.net-core – ASP.NET核心项目上的WebAPI和IdentityServer和asp.net core 5.0 webapi的知识,那么本篇文章将是您的不二之选。我们将深入剖析asp.net-core – ASP.NET核心项目上的WebAPI和IdentityServer的各个方面,并为您解答asp.net core 5.0 webapi的疑在这篇文章中,我们将为您介绍asp.net-core – ASP.NET核心项目上的WebAPI和IdentityServer的相关知识,同时也会详细的解释asp.net core 5.0 webapi的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- asp.net-core – ASP.NET核心项目上的WebAPI和IdentityServer(asp.net core 5.0 webapi)
- .net core 微服务架构 - docker 的部署 - 包括网关服务 (Ocelot)+ 认证服务 (IdentityServer4)+ 应用服务(asp.net core web api)
- .Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API
- angular – 我可以使用IdentityServer4 spa JS UI而不是asp .net核心mvc吗?
- ASP.NET Core 2.1 Web API + Identity Server 4 + Angular 6 + Angular Material 实战小项目视频
asp.net-core – ASP.NET核心项目上的WebAPI和IdentityServer(asp.net core 5.0 webapi)
我想创建一个移动应用程序,我需要一个API,提供对相同用户帐户和身份系统的访问.
我发现IdentityServer可以提供帮助,但我仍然不明白如何在同一项目中使用Identityserver和WebAPI,因为我想为webapi创建一个新项目,并允许移动客户端使用存储在数据库中的相同凭据进行身份验证.
谢谢 :)
解决方法
为了将Identity Server 4配置为与现有用户存储配合使用,我认为您需要实现IProfileService – http://docs.identityserver.io/en/release/quickstarts/3_interactive_login.html?highlight=IProfileService%20底部的简短注释确认了这一点.
将Identity Server实例连接到自己的数据存储后,您应该能够使用Identity Server实例保护API.有很多方法可以实现这一点,但我建议您在http://docs.identityserver.io/en/release/quickstarts/0_overview.html快速入门后给出一个如何使用Identity Server保护API的良好示例.
.net core 微服务架构 - docker 的部署 - 包括网关服务 (Ocelot)+ 认证服务 (IdentityServer4)+ 应用服务(asp.net core web api)
本文主要介绍通过 Docker 来部署通过.Net Core 开发的微服务架构,部署的微服务主要包括统一网关(使用 Ocelot 开发)、统一认证(IdentityServer4)、应用服务(asp.net core web api);
本文不针对微服务进行说明,后续会针对我对微服务的理解在做记录。
一、Docker 原理
对 Docker 最简单并且带有一定错误的认知就是 “Docker 是一种性能非常好的虚拟机”。
但是这是有一定错误的说法。Docker 相比于传统虚拟机的技术来说先进了不少,具体表现在 Docker 不是在宿主机上虚拟出一套硬件后再虚拟出一个操作系统,而是让 Docker 容器里面的进程直接运行在宿主机上(Docker 会做文件、网络等的隔离),这样一来 Docker 会 “体积更轻、跑的更快、同宿主机下可创建的个数更多”。
Docker 中有三个核心概念:Image、Container、Repository。
-
Image: 大家对 镜像 的概念不会陌生。但和 windows 的那种 iso 镜像相比,Docker 中的镜像是分层的,可复用的,而非简单的一堆文件迭在一起(类似于一个压缩包的源码和一个 git 仓库的区别)。
-
Container: 容器的存在离不开镜像的支持,他是镜像运行时的一个载体(类似于实例和类的关系)。依托 Docker 的虚拟化技术,给容器创建了独立的端口、进程、文件等 “空间”,Container 就是一个与宿机隔离 “容器”。容器可宿主机之间可以进行 port、volumes、network 等的通信。
-
Repository: Docker 的仓库和 git 的仓库比较相似,拥有仓库名、tag。在本地构建完镜像之后,即可通过仓库进行镜像的分发。常用的 Docker hub 有 https://hub.docker.com/(docker 官方) 、 https://cr.console.aliyun.com/(阿里云)等。
二、Windows 系统中 Docker 的安装
1、启用 Hyper-V
打开控制面板 - 程序和功能 - 启用或关闭 Windows 功能,勾选 Hyper-V,然后点击确定即可,如图:
2、下载并安装 Docker
下载地址:https://hub.docker.com/editions/community/docker-ce-desktop-windows,需要注册一个 Docker 账号才能下载
下载完成后直接安装
通过命令查看 Docker 版本号:
3、修改镜像地址
由于 Docker 官方镜像会非常慢,我是修改的阿里云的镜像
4、测试
万能的 HelloWorld,通过 PowerShell 运行 Docker run hello-world
docker ps -a //查看运行的容器
以上就是整个 Windows 中安装 Docker 环境的过程
三、ubuntu 中安装 Docker 环境
我是在 AWS 申请了一台免费的服务器,是用的 ubuntu 系统。如果需要申请 AWS 的服务器,可以通过 AWS 官网注册账号进行申请,需要填写信用卡账号,https://portal.aws.amazon.com/billing/signup#/start
本文 ubuntu 中安装 Docker 是直接参考官方教程:https://docs.docker.com/install/linux/docker-ce/ubuntu/
安装的时候最好切换到 root 账号进行安装
ubuntu 的远程是通过 putty,具体怎么用可以百度
四、发布并部署服务
1、创建 Dockerfile、发布应用程序
这是我的工程目录,构建镜像是通过 Dockerfile 来构建的。
VS2017 是支持自动构建 Dockerfile 文件,工程右键 - 添加 - Docker 支持
下面是我的 Dockerfile 的内容
FROM microsoft/aspnetcore:2.1 //基础镜像,这里是.net core的基础运行环境
WORKDIR /publish //创建工程目录
COPY . /publish //将当前目录拷贝到镜像中,注意 COPY . 后面又空格
EXPOSE 80 //容器对外暴露80端口
ENTRYPOINT ["dotnet", "ZY.Gateway.dll"] //启动容器内的服务
//这里相当于构建镜像的命令,是逐行执行
需要设置 Dockerfile 的编译为输出到发布目录
以上都设置好以后,通过 VS 发布程序
发布成功后,在工程目录的 bin/release 目录下找到我们的发布后的文件
其他服务的发布跟以上发布类似
2、上传到 ubuntu 中
通过 WinScp 工具进行上传,将三个服务都上传到服务器,WinScp 怎么用,可以百度一下
3、构建镜像
docker build -t apigateway . //构建网关镜像
docker build -t identityserver -f /home/ubuntu/dockerapp/identityserver/publish/Dockerfile . // 构建认证服务镜像
docker build -t testserver -f /home/ubuntu/dockerapp/testserver/publish/Dockerfile . // 构建测试服务镜像
-t // 镜像名称
-f //dockerfile 文件路径

docker images //查看镜像

4、运行容器
镜像已经在前面构建完成,这一步会根据构建的镜像来运行容器,将我们的服务跑起来
docker run -d -p 5000:80 --name apigateway_container apigateway
docker run -d -p 6000:80 --name identityserver_container identityserver
docker run -d -p 7000:80 --name testserver_container testserver
//分别将网关服务,认证服务,测试服务容器跑起来
//-d 保持后台进程运行 -p 端口映射,{主机端口}:{容器端口}
通过命令查看容器运行情况
docker ps -a

在配置网关服务的时候会涉及到容器与容器之间的网络访问,Docker 在安装的时候会创建一个 172.17.0.1 的 IP 网关,可以通过 172.17.0.1 来做端口的转发。
通过命令可以查看 docker0 的网关
Api 网关的路由转发配置
5、调用服务
通过 Postman 来调用通过 Docker 运行的服务,通过 API 网关访问认证服务获取 Token
整个 Docker 的安装,服务的发布,镜像的打包,容器的运行就全部完成。
整个过程不是一气呵成的,踩了不少坑,在踩坑的过程中也学到和理解了很多东西。
下一篇会介绍通过 docker-compose 进行发布,通过 docker-compose 可以实现一行命令将完成所有服务的构建镜像和运行镜像过程。
https://www.cnblogs.com/zyrmb/p/10509524.html // 这是我记录的关于 Docker 相关的命令,可以参考
https://yeasy.gitbooks.io/docker_practice/content/ // 这是针对 Docker 的整体介绍
原文出处:https://www.cnblogs.com/zyrmb/p/10496934.html
.Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API
前言
IdentityServer4 实现鉴权、授权,AspNetCore Identity实现数据库用户管理表直接生成。
ps:IdentityServer4文档上最后给的例子是 // 配置使用内存存储用户信息,但使用 EF 存储客户端和资源信息,
我初步要实现的是 //数据库存储用户信息 内存存储资源 (下一步资源也放数据库 以后弄好了有机会更)
1.创建.Net6 API程序
一顿引用,包括
防止图片挂掉打一遍文字:
- IdentityServer4、
- IdengtityServer4.AspNetIdentity、
- AspNetCore.Identity.EntityFrameWorkCore(生成数据库表用的)、
- EntityFrameWork+Disign+Tool三件套 (缺了不能自动迁移)、
- Pomelo.EntityFrameWorkCore.MySql(我是用的MySql,如果是SqlServer 不用这个用一个大概叫EF.Sqlserver的)、
- Encrypt (加密MD5用的 不必须)、
下面那个是自带的。
2.建立数据库连接类
using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using MyIDP; using MyIDP.Models; using MyIDP.Permission; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //由此重要 builder.Services.AddDbContext<IdpDbContext>(opt => { opt.UseMySql("server=127.0.0.1;Port=3306;database=AccountDb;uid=root;pwd=123456;", new MySqlServerVersion(new Version(8,0,29))); }); builder.Services.AddIdentity<ApplicationUser, IdentityRole>() .AddUserManager<MyUserManager>() .AddEntityFrameworkStores<IdpDbContext>() .AddDefaultTokenProviders(); builder.Services.AddIdentityServer() .AddDeveloperSigningCredential() .AddInMemoryIdentityResources(MyIDP.IdpConfig.GetIdentityResources()) .AddInMemoryClients(MyIDP.IdpConfig.GetClients()) .AddInMemoryApiScopes( MyIDP.IdpConfig.GetScope()) .AddInMemoryApiResources( MyIDP.IdpConfig.GetApiResources()) //.AddResourceOwnerValidator<MyResourceOwnerPasswordValidator>() //这句可以打开自主验证登录用户 //.AddProfileService<MyProfileService>() .AddAspNetIdentity<ApplicationUser>() //.AddTestUsers(new List<IdentityServer4.Test.TestUser> //{ // new IdentityServer4.Test.TestUser // { // SubjectId="123", // Username = "alice", // Password = "alice", // Claims = new List<Claim>() { // new Claim(JwtClaimTypes.Role, "superadmin"), // new Claim(JwtClaimTypes.Role, "admin") // } // } //}) ; var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseIdentityServer(); app.UseAuthorization(); app.MapControllers(); app.Run();
3.Program里开始加东西(如果是历史的Net版本,是在StartUp里)
using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using MyIDP; using MyIDP.Models; using MyIDP.Permission; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //由此重要 builder.Services.AddDbContext<IdpDbContext>(opt => { opt.UseMySql("server=127.0.0.1;Port=3306;database=AccountDb;uid=root;pwd=123456;", new MySqlServerVersion(new Version(8,0,29))); }); builder.Services.AddIdentity<ApplicationUser, IdentityRole>() .AddUserManager<MyUserManager>() .AddEntityFrameworkStores<IdpDbContext>() .AddDefaultTokenProviders(); builder.Services.AddIdentityServer() .AddDeveloperSigningCredential() .AddInMemoryIdentityResources(MyIDP.IdpConfig.GetIdentityResources()) .AddInMemoryClients(MyIDP.IdpConfig.GetClients()) .AddInMemoryApiScopes( MyIDP.IdpConfig.GetScope()) .AddInMemoryApiResources( MyIDP.IdpConfig.GetApiResources()) //.AddResourceOwnerValidator<MyResourceOwnerPasswordValidator>() //这句可以打开自主验证登录用户 //.AddProfileService<MyProfileService>() .AddAspNetIdentity<ApplicationUser>() //.AddTestUsers(new List<IdentityServer4.Test.TestUser> //{ // new IdentityServer4.Test.TestUser // { // SubjectId="123", // Username = "alice", // Password = "alice", // Claims = new List<Claim>() { // new Claim(JwtClaimTypes.Role, "superadmin"), // new Claim(JwtClaimTypes.Role, "admin") // } // } //}) ; var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseIdentityServer(); app.UseAuthorization(); app.MapControllers(); app.Run();
因为使用的是内存储存t鉴权信息的方式,所以建立IdentityServer4的配置类IdpConfig
public static class IdpConfig { public static IEnumerable<IdentityResource> GetIdentityResources() { return new IdentityResource[] { new IdentityResources.OpenId(), new IdentityResources.Profile(), new IdentityResources.Address(), new IdentityResources.Phone(), new IdentityResources.Email() }; } public static IEnumerable<ApiResource> GetApiResources() { //return new ApiResource[] //{ // new ApiResource("api1", "My API #1",new List<string>(){JwtClaimTypes.Role}) //}; //新写法 return new[] { new ApiResource("api1", "My API #1") { Scopes = { "scope1"} } }; } public static IEnumerable<Client> GetClients() { return new[] { #region MyRegion //// client credentials flow client //new Client //{ // ClientId = "console client", // ClientName = "Client Credentials Client", // AllowedGrantTypes = GrantTypes.ClientCredentials, // ClientSecrets = { new Secret("511536EF-F270-4058-80CA-1C89C192F69A".Sha256()) }, // AllowedScopes = { "api1" } //}, #endregion // wpf client, password grant new Client { ClientId = "client", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("secret".Sha256()) }, AllowedScopes = //允许当访问的资源 { "scope1", //"api1", IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Email, IdentityServerConstants.StandardScopes.Address, IdentityServerConstants.StandardScopes.Phone, IdentityServerConstants.StandardScopes.Profile } } }; } public static IEnumerable<ApiScope> GetScope() { return new ApiScope[] { new ApiScope("scope1"), new ApiScope("scope2"), }; } }
数据库的usernamager
public class MyUserManager : UserManager<ApplicationUser> { public MyUserManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators, IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<ApplicationUser>> logger) : base(store, optionsAccessor, new MyPasswordHasher(), userValidators, passwordValidators, keyNormalizer, errors, services, logger) { optionsAccessor.Value.Password.RequireDigit = false; optionsAccessor.Value.Password.RequiredLength = 4; optionsAccessor.Value.Password.RequireLowercase = false; optionsAccessor.Value.Password.RequireUppercase = false; optionsAccessor.Value.Password.RequireNonAlphanumeric = false; } }
重写验证密码的方法类MyResourceOwnerPasswordValidator,(如果没有打开Program中的AddResourceOwnerValidator<MyResourceOwnerPasswordValidator>() 则不需要)
public class MyResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator { public readonly SignInManager<ApplicationUser> signInManager; private readonly MyUserManager userManager; //public readonly IEventService service; public MyResourceOwnerPasswordValidator(MyUserManager userService, SignInManager<ApplicationUser> signInManager)//, IEventService service) { userManager = userService; this.signInManager = signInManager; //this.service = service; } public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { if (string.IsNullOrEmpty(context.UserName) || string.IsNullOrEmpty(context.Password)) { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "验证被拒绝,用户名或者密码为空。"); return; } var user = await userManager.FindByNameAsync(context.UserName); if (user == null) { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "验证失败,不存在当前用户。"); return; } //检验用户密码(虽然我也不知道他的密码是采用什么加密方式得到的,但是我也不需要知道) var passwordPass = await userManager.CheckPasswordAsync(user, context.Password); if (!passwordPass) { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "验证失败,用户凭证错误"); return; } else { try { await userManager.AddLoginAsync(user, new UserLoginInfo(user.Id, "", user.UserName)); } catch (Exception ex) { ; } finally { context.Result = new GrantValidationResult(user.Id, GrantType.ResourceOwnerPassword, new List<Claim>() { new Claim("account", user.UserName) }); } } return; } }
MyPasswordHasher
public class MyPasswordHasher : PasswordHasher<ApplicationUser> { public override string HashPassword(ApplicationUser user, string password) { //PasswordHasher<ApplicationUser> ph = new PasswordHasher<ApplicationUser>(); //var pstr = ph.HashPassword(new ApplicationUser(), password); //return pstr; return password.MD5(); } public override PasswordVerificationResult VerifyHashedPassword(ApplicationUser user, string hashedPassword, string providedPassword) { if (providedPassword.MD5().Equals(hashedPassword)) { return PasswordVerificationResult.Success; } else { return PasswordVerificationResult.Failed; } } }
创建自己的User类 ApplicationUser继承 IdentityUser 复写自带的AspNetUser表
public class ApplicationUser : IdentityUser { public string MySomething { get; set; } = ""; /// <summary> /// 创建时间 /// </summary> public DateTime CreateTime { get; set; } /// <summary> /// 创建人Id /// </summary> public string CreatorId { get; set; } = ""; /// <summary> /// 否已删除 /// </summary> public bool Deleted { get; set; } /// <summary> /// 姓名 /// </summary> public string RealName { get; set; } /// <summary> /// 性别 /// </summary> public Sex Sex { get; set; } /// <summary> /// 出生日期 /// </summary> public DateTime? Birthday { get; set; } /// <summary> /// 所属部门Id /// </summary> public string DepartmentId { get; set; } = ""; public string OtherData { get; set; } = ""; // 用户角色 用户权限 用户信息 用户登录tokens 重新绑定与父类的关系 命名必须和父类一致 public virtual ICollection<IdentityUserRole<string>> UserRoles { get; set; } public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; } public virtual ICollection<IdentityUserLogin<string>> Logins { get; set; } public virtual ICollection<IdentityUserToken<string>> Tokens { get; set; } } public enum Sex { [Description("男")] Man = 1, [Description("女")] Woman = 0 }
至此可以生成数据库迁移后 Postman测试一下:
到此这篇关于.Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API的文章就介绍到这了,更多相关.Net6 读取数据表用户内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- 关于.NET6 Minimal API的使用方式详解
- 使用.Net6中的WebApplication打造最小API
- 使用.NET6实现动态API
- .NET6在WebApi中使用日志组件log4net
- .NET6自定义WebAPI过滤器
- .NET6使WebApi获取访问者IP地址
angular – 我可以使用IdentityServer4 spa JS UI而不是asp .net核心mvc吗?
解决方法
ASP.NET Core 2.1 Web API + Identity Server 4 + Angular 6 + Angular Material 实战小项目视频
视频简介
ASP.NET Core Web API + Angular 6的教学视频
我是后端开发人员, 前端的Angular部分讲的比较差一些, 可以直接看代码!!!!
这是一个小项目的实战视频, 该项目采用了:
-
ASP.NET Core 2.1 做API
-
Identity Server 4
-
Angular 6
-
Angular Material
这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者.
项目最终完成的效果如图:
视频目录
视频专辑地址: http://v.qq.com/vplus/4cfb00af75c16eb8d198c58fb86eb4dc/foldervideos/8hk0029019k2fft
源码以及PPT: https://github.com/solenovex/ASP.NET-Core-2.1-Angular-6-Demo
第一部分建立Web API及其CRUD功能
- 建立ASP.NET Core项目, 以及Program和Startup的简介
- 配置ASP.NET Core项目
- 环境, HTTPS等
- 添加Entity Framework Core 2.1支持
- 继续配置ASP.NET Core项目
- 添加Serilog
- 添加配置文件, 处理全局异常
- 大致完成ASP.NET Core项目的建立, Resource Model, AutoMapper, FluentValidation
- 实现后端的GET
- REST简介, 以及GET的简单实现
- 翻页, 过滤, 排序等等
- GET的塑性, HATEOAS, 自定义Media Type
- POST, PUT, PATCH, DELETE, 实体验证
第二部分, 建立Identity Server 4项目, 添加Mvc客户端(测试用)
- OAuth 2.0 & OpenId Connect 简介 (可选)
- 使用Mvc客户端访问被保护的API资源(处于测试的目的)
第三部分, 建立Angular项目, 使用Implicit Flow进行身份认证, 访问被保护的API
- 建立Angular 6项目, 配置Angular Material和UI布局, 路由等.....
- 访问被保护的API
- 访问未被保护的API资源
- 跨域访问API的另一种办法
- oidc-client.js, 集成Angular客户端到Identity Server 4
- 其它功能(上)
- 其它功能(下)
今天关于asp.net-core – ASP.NET核心项目上的WebAPI和IdentityServer和asp.net core 5.0 webapi的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net core 微服务架构 - docker 的部署 - 包括网关服务 (Ocelot)+ 认证服务 (IdentityServer4)+ 应用服务(asp.net core web api)、.Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API、angular – 我可以使用IdentityServer4 spa JS UI而不是asp .net核心mvc吗?、ASP.NET Core 2.1 Web API + Identity Server 4 + Angular 6 + Angular Material 实战小项目视频的相关知识,请在本站搜索。
本文标签: