1.新建项目并添加引用

新建一个asp .net core 2.0的项目
引用IdentityServer4.AspNetIdentity

2.定义资源

新建Config.cs文件,定义Api资源与Identity资源
资源分为身份资源(Identity resources)和API资源(API resources)

(1)身份资源(Identity resources)

身份资源是用户的用户名,姓名或电子邮件地址等数据。身份资源具有唯一的名称,可以为其分配任意声明类型。然后,这些声明将被包含在用户的身份令牌中。客户端将使用scope参数来请求访问身份资源。
身份资源可以是IdentityServer自带的资源,也可以是自定义的资源。

public static IEnumerable<IdentityResource> GetIdentityResources()
{//自定义身份资源var customProfile = new IdentityResource(name: "custom.profile",displayName: "Custom profile",claimTypes: new[] { "name", "email", "status" });return new List<IdentityResource>{//IdentityServer自带的资源new IdentityResources.OpenId(),new IdentityResources.Profile(),customProfile};
}

(2)API资源(API resources)

API资源是客户端访问API获得的资源

public static IEnumerable<ApiResource> GetApiResources()
{return new List<ApiResource>{//具有单一范围的简单API(在这种情况下,范围名称与api名称相同)new ApiResource("api1", "My API"),// 扩展版本,更多的设置选项new ApiResource{Name = "api2",// 用于内部校验的密码// ApiSecrets是用于内部校验的,API的名称(Name)和密码(ApiSecrets)可以用于认证ApiSecrets ={new Secret("secret".Sha256())},// 在访问令牌中包含以下内容(除了subject ID)// UserClaims表示用户声明UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.Email },// // 该API定义了两个范围Scopes ={new Scope(){Name = "api2.full_access",DisplayName = "Full access to API 2",},new Scope{Name = "api2.read_only",DisplayName = "Read only access to API 2"}}}};
}

3.定义客户端Client

客户端指想要访问资源的Client

public static IEnumerable<Client> GetClients()
{return new List<Client>{//不一定要配置得这么复杂,根据需求来new Client{ClientId = "mvc",ClientName = "MVC Client",AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,RequireConsent = true,ClientSecrets = {new Secret("secret".Sha256())},//这里配置客户端的网址,多个客户端则是多个网址RedirectUris = { "http://localhost:5002/signin-oidc" },PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },//允许的范围AllowedScopes ={IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile,"api1"},AllowOfflineAccess = true}};
}

其他配置请参阅:
https://identityserver4.readthedocs.io/en/release/topics/clients.html

4.配置

把资源信息和客户端信息交给IdentityServer

public void ConfigureServices(IServiceCollection services)
{//配置服务services.AddIdentityServer()//读取客户端列表.AddInMemoryClients(Clients.Get())//读取身份资源列表.AddInMemoryIdentityResources(Resources.GetIdentityResources())//读取API资源列表.AddInMemoryApiResources(Resources.GetApiResources())//设置临时签名凭据.AddDeveloperSigningCredential()//添加测试用户.AddTestUsers(TestUsers.Users);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{//配置管道:注意配置管道要写在路由的前面...app.UseIdentityServer();
}

这里需要注意的是,以上的资源信息和客户端信息是存在内存中的,可以设置为读取数据库
参阅:https://identityserver4.readthedocs.io/en/release/quickstarts/8_entity_framework.html

5.多客户端的统一登录

(1)用户表

//ApplicationUser继承于IdentityUser,可以在此为用户表添加属性,字段
public class ApplicationUser : IdentityUser
{
}

(2)页面

<div class="col-md-4"><section><form asp-route-returnurl="@ViewData["ReturnUrl"]" method="post"><h4>Use a local account to log in.</h4><hr /><div asp-validation-summary="All" class="text-danger"></div><div class="form-group"><!--整个流程是根据邮箱进行注册和登录的--><label asp-for="Email"></label><input asp-for="Email" class="form-control" /><span asp-validation-for="Email" class="text-danger"></span></div><div class="form-group"><label asp-for="Password"></label><input asp-for="Password" class="form-control" /><span asp-validation-for="Password" class="text-danger"></span></div><div class="form-group"><div class="checkbox"><label asp-for="RememberMe"><input asp-for="RememberMe" />@Html.DisplayNameFor(m => m.RememberMe)</label></div></div><div class="form-group"><button type="submit" class="btn btn-default">Log in</button></div><div class="form-group"><p><a asp-action="ForgotPassword">Forgot your password?</a></p><p><a asp-action="Register" asp-route-returnurl="@ViewData["ReturnUrl"]">Register as a new user?</a></p></div></form></section>
</div>

(3)登录方法

这里是AspNet Identity的内容

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{ViewData["ReturnUrl"] = returnUrl;if (ModelState.IsValid){// 尝试登录// 需要注意的是,这里没有对登录失败进行计数// 为了在登录失败多次之后触发锁定用户,把lockoutOnFailure设置为truevar result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);if (result.Succeeded){_logger.LogInformation("User logged in.");return RedirectToLocal(returnUrl);}if (result.RequiresTwoFactor){return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });}if (result.IsLockedOut){_logger.LogWarning("User account locked out.");return RedirectToAction(nameof(Lockout));}else{ModelState.AddModelError(string.Empty, "Invalid login attempt.");return View(model);}}return View(model);
}

6.设置IdentityServer项目的端口号为5000

7.其他

整个流程还需要包括注册,注销,忘记密码,第三方登录,修改用户信息等,这些不属于IdentityServer的讨论范畴,在此不做讨论

转载于:https://www.cnblogs.com/Lulus/p/7986635.html

基于IdentityServer4的单点登录——IdentityServer相关推荐

  1. 基于IdentityServer4的单点登录——项目基本结构与流程

    组成 IdentityServer,Api和Client(客户端,asp .net core) 本文以官方demo:https://github.com/IdentityServer/Identity ...

  2. 基于.Net的单点登录(SSO)解决方案

    基于.Net的单点登录(SSO)解决方案 前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助. ...

  3. 【No.1】基于Cookie的单点登录(SSO)

    2019独角兽企业重金招聘Python工程师标准>>> 这篇主要说明基于Cookie的单点登录实现,以及Cookie的一些特性以及使用说明. 1.Cookie是什么,如何工作的 在程 ...

  4. 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心...

    基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...

  5. 基于Cookie的单点登录(SSO)系统介绍

    基于Cookie的单点登录(SSO)系统介绍 SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分.SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保 ...

  6. 基于SAML的单点登录介绍

    一.背景知识: SAML即安全断言标记语言,英文全称是Security Assertion Markup Language.它是一个基于XML的标准,用于在不同的安全域(security domain ...

  7. Spring Cloud入门-Oauth2授权之基于JWT完成单点登录(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 单点登录简介 创建oauth2-client模块 修改授权服务器配置 网页单点登录演示 调用接口单点登录演示 oauth2-client添加权限校 ...

  8. SSO单点登录学习总结(2)——基于Cookie+fliter单点登录实例

    1.使用Cookie解决单点登录 技术点: 1.设置Cookie的路径为setPath("/").即Tomcat的目录下都有效 2.设置Cookie的域setDomain(&quo ...

  9. SSO单点登录-基于cookie的单点登录

    1.概述 单点登录(Single-Sign-On),简称SSO,它的解释为:在多个应用系统中,只要登陆一次,便可以访问其它相互信任的系统.早期系统由于只有一个服务,因此只需要登录一次,就可以访问系统的 ...

  10. IdentityServer4实现单点登录统一认证

    什么是单点登录统一认证:假如某公司旗下有10个网站(比如各种管理网站:人事系统啊,财务系统啊,业绩系统啊等),我是该公司一管理员或者用户,按照传统网站模式是这样:我打开A网站 输入账号密码 然后进入到 ...

最新文章

  1. linux mysql怎么启动_linux下安装完mysql 怎么启动
  2. uvalive4836(枚举)
  3. MFC程序打开文件对话框出错的问题解决
  4. oracle =1,oracle中的 where 1=1 和where 1 !=1
  5. 优云数智UMCloud CTO王璞:IaaS+PaaS驱动私有云未来十年
  6. 最小化安装CentOS-7-x86_64-Minimal-1511图文教程
  7. 如何制作自己的Visio图标
  8. NVIDIA Nsight Systems 入门及使用
  9. IOS fiddler抓包配置
  10. 服务器信息批量收集,如何批量导入或导出服务器信息
  11. 如何用计算机做牛顿迭代公式,牛顿迭代法
  12. 【Unity2D】制作游戏主菜单MainMenu
  13. 武汉大学计算机学院宿舍楼名称,武汉大学寝室排名 寝室图片
  14. ST-Link该如何升级?
  15. HNOI 2015 亚瑟王 题解
  16. NVIDIA NCCL 源码学习(二)- bootstrap网络连接的建立
  17. 华为mate40pro有没有鸿蒙,mate40pro不能升级鸿蒙吗?我啥也不懂,完蛋了
  18. dotnet 配置 Gitlab 的 Runner 做 CI 自动构建
  19. ArcGIS栅格按照象元大小生成矢量的方法
  20. 科技爱好者周刊(第 212 期):人生不短

热门文章

  1. java lambda有必要_深度分析:java8的新特性lambda和stream流,看完你学会了吗?
  2. 扩展频谱--直接序列扩频
  3. pandaboard 安装_pandaboard ES学习之旅——3 Uboot源码下载与编译
  4. stm32通讯协议编写源码_STM32连接TFT-LCD
  5. python 二维矩阵画三维图_python 二维矩阵转三维矩阵示例
  6. 凸优化有关的数值线性代数知识 作业题
  7. 干货 | 各大AI研究院共35场NLP算法岗面经奉上
  8. 【数字图像处理系列四】图像数据集增强方式总结和实现
  9. 向量组A可以由一个向量组B表出,并且A的秩小于B的秩,那么A线性相关
  10. php 前后端 不对称加密,AES前后端对称加密