IDS4

  • 一、参考文章
    • 1.OAuth2.0和OCID讲解
  • 二、个人总结
    • 1.Implicit隐式流程认证服务器端
      • (1)创建IDS4认证服务器和客户端
      • (2)修改IDS4认证服务器的视图UI
      • (3)添加资源配置
      • (4)Program配置(相当与3.1的Startup配置,6.0Startup类被删了)
    • 2.Implicit隐式流客户端
      • (1)修改Program
      • (2)添加认证特性

一、参考文章

注意IDS4的版本与之前的版本有所不同,这些文档有些是旧版本,需要细微调整,会在下文给予标注

1.OAuth2.0和OCID讲解

IDS4官方文档
IDS4官方文档

晓晨Master的概念详解
概念理解

*Hunter的项目实战
实战项目

阮一峰的网络日志
阮一峰的网络日志

二、个人总结

基于使用的net6版本

1.Implicit隐式流程认证服务器端

Nuget包安装

(1)创建IDS4认证服务器和客户端

创建认证服务器MVC模板
创建MVC客户端(两个都选择MVC模板)

分别打开认证服务器和客户端的Propertieswen文件中launchSetting.json修改启动地址
客户端是5001 ,认证服务器设置为5000

项目启动以项目启动

(2)修改IDS4认证服务器的视图UI

  1. 进入认证服务器的项目的根目录,键入CMD界面
  2. 创建Ids4的UI界面
    执行dotnet new is4ui --force,–force是强制覆盖原有的mvc文件,
    如果没有模板,先下载模板, 1)安装模板命令:dotnet new -i IdentityServer4.Templates
  3. 现在的目录结构

    删除Controller文件因为Quickstart文件中也有HomeController,会有多个端点,出现错误

(3)添加资源配置

  1. 创建Config.cs文件
    public static class Config{public static IEnumerable<ApiResource> GetApiResources(){return new List<ApiResource>{new ApiResource("api1", "My API")};}public static IEnumerable<Client> GetClients(){return new List<Client>(){new Client(){ClientId="client1",ClientName="mvc client",AllowedGrantTypes=GrantTypes.Implicit,RedirectUris={"http://localhost:5001/signin-oidc"},PostLogoutRedirectUris={"http://localhost:5001/signout-callback-oidc"},FrontChannelLogoutUri = "http://localhost:5000/signout-idsrv",AllowAccessTokensViaBrowser=true,AllowedScopes=new List<string>{IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile}}};}public static List<TestUser> GetUsers(){return new List<TestUser>{new TestUser{SubjectId = "1",Username = "alice",Password = "password"},new TestUser{SubjectId = "2",Username = "bob",Password = "password"}};}public static IEnumerable<IdentityResource> GetIdentityResources(){return new List<IdentityResource>{new IdentityResources.OpenId(),new IdentityResources.Profile(),};}}

(4)Program配置(相当与3.1的Startup配置,6.0Startup类被删了)

Program.CS


var builder = WebApplication.CreateBuilder(args);//部分浏览器版本较新SameSite不设置会出现报错,
builder.Services.Configure<CookiePolicyOptions>(options =>
{options.MinimumSameSitePolicy = SameSiteMode.Lax;options.OnAppendCookie = cookieContext =>CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);options.OnDeleteCookie = cookieContext =>CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
static void CheckSameSite(HttpContext httpContext, CookieOptions options)
{if (options.SameSite == SameSiteMode.None){var userAgent = httpContext.Request.Headers["User-Agent"].ToString();options.SameSite = SameSiteMode.Lax;}
}// Add services to the container.//添加mvc,后面登录需要
builder.Services.AddMvc();
builder.Services.AddControllersWithViews();//这部分是对资源的配置
builder.Services.AddIdentityServer()//添加身份资源配置.AddInMemoryIdentityResources(Config.GetIdentityResources())//设置证书.AddDeveloperSigningCredential()//添加API资源设置.AddInMemoryApiResources(Config.GetApiResources())//推荐测试用户.AddTestUsers(Config.GetUsers())//添加客户端.AddInMemoryClients(Config.GetClients());
var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();app.UseCookiePolicy();
app.UseRouting();
app.UseIdentityServer();
app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();

2.Implicit隐式流客户端

(1)修改Program


var builder = WebApplication.CreateBuilder(args);builder.Services.Configure<CookiePolicyOptions>(options =>
{options.MinimumSameSitePolicy = SameSiteMode.Unspecified;options.OnAppendCookie = cookieContext =>SetSameSite(cookieContext.Context, cookieContext.CookieOptions);options.OnDeleteCookie = cookieContext =>SetSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
//部分浏览器版本较新SameSite不设置会出现报错,
void SetSameSite(HttpContext httpContext, CookieOptions options)
{if (options.SameSite == SameSiteMode.None){if (httpContext.Request.Scheme != "https"){options.SameSite = SameSiteMode.Unspecified;}}
}
builder.Services.Configure<CookiePolicyOptions>(options =>
{// This lambda determines whether user consent for non-essential cookies is needed for a given request.options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None;
});builder.Services.AddMvc();
//AddAuthentication将认证服务添加到DI
builder.Services.AddAuthentication(options => {options.DefaultScheme = "Cookies";//设置Cookies为主要认证手段options.DefaultChallengeScheme = "oidc";//当需要登录时使用OpenID Connect方案
})
.AddCookie("Cookies")//使用AddCookie添加可以处理cookie的处理程序。
.AddOpenIdConnect("oidc", options => {options.SignInScheme = "Cookies";options.Authority = "http://localhost:5000";options.RequireHttpsMetadata = false;options.ClientId = "client1";options.SaveTokens = true;
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();//添加Cookie,不让报错,无法正常使用
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
// 看登录的用户是否有权限
app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();

(2)添加认证特性

自带的HomeController中添加,当未登录用户访问触发认证流程

IdentityServer4实战详解相关推荐

  1. 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

    本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...

  2. R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等

    R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录

  3. R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比

    R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...

  4. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  5. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  6. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

    R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

  7. R语言tidyr包separate()函数实战详解:一列裂变为多列

    R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列

  8. 《oracle大型数据库系统在AIX/unix上的实战详解》讨论31: oracle、sybase 数据库的不同访问...

    <Oracle大型数据库系统在AIX/UNIX上的实战详解> 讨论31:  oracle.sybase 数据库的不同访问方式   文平. 用户来信要求更细节比较一下Oracle和sybas ...

  9. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. MSFNet:多重空间融合网络进行实时语义分割(北航和旷视联合提出)
  2. 基于存储过程的可扩展性数据访问框架
  3. PHP中include()与require()的区别说明
  4. 【干货】女性社区应该如何抵御垃圾男
  5. <读书笔记> Thinking in python (Python 设计模式) 1. Singlton的c++与python的实现
  6. java反射api研究_深入研究Java 8中的可选类API
  7. 两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...
  8. Intel 收购计算机视觉开发公司 Itseez
  9. Java 目录操作一(递归创建目录、删除目录、判断目录是否为空、判断文件是否隐藏、获取目录大小、在指定目录中查找文件)
  10. hibernate 各种主键生成策略(转)
  11. 为什么Linux内核常用unsigned long来代替指针
  12. ubuntu下python多版本切换问题
  13. 2017-08-16 BEX5下集成FullCalendar
  14. 【BZOJ1703】【usaco2007margold】ranking the cows 奶牛的魅力排名
  15. 哲理故事300篇 下
  16. Java自学第15天 面向对象(全)
  17. 耐心看完,越到后面越精彩
  18. day16-20180705-流利阅读笔记
  19. Python员工信息作业
  20. 主动降噪相消干涉原理

热门文章

  1. 优达学城 深度学习 任务2
  2. windows7 系统搭建webdav服务
  3. Android实现记事本功能
  4. 战地一服务器性能低怎么办,《战地1》帧数优化图文攻略 战地1帧数低怎么办?...
  5. Android设备管理器
  6. JSON数据格式(键值对)(一)
  7. 一条sql是如何执行的
  8. Oracle不能用system用户 ORA-01017
  9. 2020保研夏令营回顾--清华网研院+清华深研院
  10. php简易留言板功能,php简单的留言板与回复功能具体实现