aspnetcore 应用 接入Keycloak快速上手指南

登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种场景而生。本文将简明的介绍Keycloak的安装、使用,并给出aspnetcore 应用如何快速接入Keycloak的示例。

Keycloak是什么

Keycloak是一种面向现代应用和服务的开源IAM(身份识别与访问管理)解决方案

Keycloak提供了单点登录(SSO)功能,支持OpenID ConnectOAuth 2.0SAML 2.0标准协议,拥有简单易用的管理控制台,并提供对LDAP、Active Directory以及Github、Google等社交账号登录的支持,做到了非常简单的开箱即用。

官网:https://www.keycloak.org/

Keycloak常用核心概念介绍

首先通过官方的一张图来了解下整体的核心概念

这里先只介绍4个最常用的核心概念:

  1. Users: 用户,使用并需要登录系统的对象

  2. Roles: 角色,用来对用户的权限进行管理

  3. Clients: 客户端,需要接入Keycloak并被Keycloak保护的应用和服务

  4. Realms: 领域,领域管理着一批用户、证书、角色、组等,一个用户只能属于并且能登陆到一个域,域之间是互相独立隔离的, 一个域只能管理它下面所属的用户

Keycloak服务安装及配置

安装Keycloak

Keycloak安装有多种方式,这里使用Docker进行快速安装

登录后复制

docker run -d --name keycloak \-p 8080:8080 \-e KEYCLOAK_USER=admin \-e KEYCLOAK_PASSWORD=admin \jboss/keycloak:13.0.0

访问http://localhost:8080并点击Administration Console进行登录

 

 

创建Realm

创建一个新的realm: demo,后续所有的客户端、用户、角色等都在此realm中创建

创建客户端
创建前端应用客户端

创建一个新的客户端:KeycloakAuthaspnet,Access Type选择confidential

关于客户端的访问类型(Access Type)

上面创建的客户端的访问类型分别是confidential,那么为什么分别选择这种类型,实际不同的访问类型有什么区别呢?

事实上,Keycloak目前的访问类型共有3种:

  • confidential:适用于服务端应用,且需要浏览器登录以及需要通过密钥获取access token的场景。典型的使用场景就是服务端渲染的web系统。

  • public:适用于客户端应用,且需要浏览器登录的场景。典型的使用场景就是前端web系统,包括采用vue、react实现的前端项目等。

  • bearer-only:适用于服务端应用,不需要浏览器登录,只允许使用bearer token请求的场景。典型的使用场景就是restful api。

 

Access Type 里面选 Confidential,然后才有 Client Secret ,保存之后,会出现Credentials的Tab,记录下这里的secret,后面要用到

 

创建用户和角色
创建角色

创建2个角色:admin、user

还可以创建全局的角色

 

创建用户

创建1个用户:geffzhang

 

绑定用户和角色
给geffzhang 用户分配角色admin和user

 

aspnetcore 应用集成Keycloak简明指南

 

添加 Microsoft.AspNetCore.Authentication.OpenIdConnect  和  Microsoft.AspNetCore.Identity 包

 

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
     <TargetFramework>net5.0</TargetFramework>
     <UserSecretsId>afab524d-850e-499a-bc13-98f61ca0eb3b</UserSecretsId>
     <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
   </PropertyGroup>

  <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="5.0.5" />
     <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" />
     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" />
     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
   </ItemGroup>

</Project>

 

Appsettings.json

 

 

 

// This method gets called by the runtime. Use this method to add services to the container.
     public void ConfigureServices(IServiceCollection services)
     {
         services.AddControllersWithViews();
        
         services.AddAuthentication(options =>
         {
             //Sets cookie authentication scheme
             options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
             options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
             options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
         })

        .AddCookie(cookie =>
         {
             //Sets the cookie name and maxage, so the cookie is invalidated.
             cookie.Cookie.Name = "keycloak.cookie";
             cookie.Cookie.MaxAge = TimeSpan.FromMinutes(60);
             cookie.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
             cookie.SlidingExpiration = true;
         })
         .AddOpenIdConnect(options =>
         {
             /*
              * ASP.NET core uses the http://*:5000 and https://*:5001 ports for default communication with the OIDC middleware
              * The app requires load balancing services to work with :80 or :443
              * These needs to be added to the keycloak client, in order for the redirect to work.
              * If you however intend to use the app by itself then,
              * Change the ports in launchsettings.json, but beware to also change the options.CallbackPath and options.SignedOutCallbackPath!
              * Use LB services whenever possible, to reduce the config hazzle :)
             */

            //Use default signin scheme
             options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
             //Keycloak server
             options.Authority = Configuration.GetSection("Keycloak")["ServerRealm"];
             //Keycloak client ID
             options.ClientId = Configuration.GetSection("Keycloak")["ClientId"];
             //Keycloak client secret
             options.ClientSecret = Configuration.GetSection("Keycloak")["ClientSecret"];
             //Keycloak .wellknown config origin to fetch config
             options.MetadataAddress = Configuration.GetSection("Keycloak")["Metadata"];
             //Require keycloak to use SSL
             options.RequireHttpsMetadata = false;
             options.GetClaimsFromUserInfoEndpoint = true;
             options.Scope.Add("openid");
             options.Scope.Add("profile");
             //Save the token
             options.SaveTokens = true;
             //Token response type, will sometimes need to be changed to IdToken, depending on config.
             options.ResponseType = OpenIdConnectResponseType.Code;
             //SameSite is needed for Chrome/Firefox, as they will give http error 500 back, if not set to unspecified.
             options.NonceCookie.SameSite = SameSiteMode.Unspecified;
             options.CorrelationCookie.SameSite = SameSiteMode.Unspecified;
            
             options.TokenValidationParameters = new TokenValidationParameters
             {
                 NameClaimType = "name",
                 RoleClaimType = ClaimTypes.Role,
                 ValidateIssuer = true
             };


         });

        /*
          * For roles, that are defined in the keycloak, you need to use ClaimTypes.Role
          * You also need to configure keycloak, to set the correct name on each token.
          * Keycloak Admin Console -> Client Scopes -> roles -> mappers -> create
          * Name: "role client mapper" or whatever you prefer
          * Mapper Type: "User Client Role"
          * Multivalued: True
          * Token Claim Name: role
          * Add to access token: True
          */

       
         /*
          * Policy based authentication
          */

        services.AddAuthorization(options =>
         {
             //Create policy with more than one claim
             options.AddPolicy("users", policy =>
             policy.RequireAssertion(context =>
             context.User.HasClaim(c =>
                     (c.Value == "user") || (c.Value == "admin"))));
             //Create policy with only one claim
             options.AddPolicy("admins", policy =>
                 policy.RequireClaim(ClaimTypes.Role, "admin"));
             //Create a policy with a claim that doesn't exist or you are unauthorized to
             options.AddPolicy("noaccess", policy =>
                 policy.RequireClaim(ClaimTypes.Role, "noaccess"));
         });


         /*
          * Non policy based authentication
          * Uncomment below and comment the policy p
          */
       
         //services.AddAuthorization();

    }

经过上述的配置,通过oidc 很容易就接入到了Keycloak。具体代码请参见:https://github.com/NanoFabricFX/AspNetCore-keycloak/tree/dotnet5。

 

运行效果,第一次访问项目会跳转Keycloak登录页

 

用户登陆geffzhang

 

总结

Keycloak部署及接入简单,轻量的同时功能又不失强大,非常适合企业内部的SSO方案。在Identity Server4 收费的背景之下,微软计划在.NET 6里面继续集成,已经被社区骂的狗血喷头https://devblogs.microsoft.com/aspnet/asp-net-core-6-and-authentication-servers/ 

相关文章:

  • https://gruchalski.com/posts/2020-09-05-introduction-to-keycloak-authorization-services/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机安全模型研究与应用,软件哨兵安全动态检测模型的研究与实现-计算机应用研究.PDF...

软件哨兵安全动态检测模型的研究与实现-计算机应用研究第&#xff12;&#xff19;卷第&#xff18;期 计 算 机 应 用 研 究 &#xff36;&#xff4f;&#xff4c;&#xff0e;&#xff12;&#xff19;&#xff2e;&#xff4f;&#xff0e;&#xff18;&#xff12;&#x…

隐藏在数学中的哲理,令人回味无穷

全世界有3.14 % 的人已经关注了数据与算法之美人们在欣赏优美的数、式和数学图形时&#xff0c;将其与现实生活联系&#xff0c;引入到人们的精神世界中&#xff0c;产生丰富的联想和创造&#xff0c;反映出人们崇高的思想境界和要求&#xff0c;因而产生了风格独特、内涵深刻、…

无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...

冷链&#xff0c;即冷冻冷藏供应链的简称&#xff0c;泛指冷藏冷冻类食品从原材料供应物流、食品工厂内生产物流、贮藏运输物流至贩卖销售物流等&#xff0c;各个环节中始终处于规定的低温环境下&#xff0c;以保证食品质量&#xff0c;减少食品损耗的一项系统工程 。随着科学技…

前端老弟第一次写后端,崩了!

幽默轻松小知识&#xff0c;一起来看看老弟第一次写的后端代码&#xff0c;你觉得如何&#xff1f;大家好&#xff0c;我是鱼皮&#xff0c;今天分享我的老弟第一次写后端代码时出现的囧事&#xff0c;希望大家引以为戒。孽起我的老弟小阿巴&#xff0c;目前大一&#xff0c;自…

Windows Phone 7 系统主题颜色RGB和Hex值

Windows Phone 主题是背景色与个性色的组合。背景色是背景的颜色&#xff0c;个性色是应用于控件和其他可视元素的颜色。有两种背景选项可供使用&#xff08;深色和浅色&#xff09;&#xff0c;另外共有 10 种标准个性色可用于您的应用程序。 下表列出了 10 种标准个性色及其以…

小米8对一加6打开软件速度测试,买一加6还是小米8?小米8和一加6区别对比

买一加6还是小米8&#xff1f;据相关媒体报道&#xff0c;继一加6后&#xff0c;小米前些天也推出了同样搭载骁龙845处理器的最新旗舰——“小米8”。值得一提的是&#xff0c;小米8还被官方称为“8周年的代表之作”&#xff01;那么&#xff0c;一加6和小米8哪个更好一些&…

面试算法工程师时,我居然被化学专业转行的老哥血虐了

全世界有3.14 % 的人已经关注了数据与算法之美我是小A&#xff0c;一个没能当成算法工程师的菜鸡Java工程师&#xff0c;内心却等着上AI这趟车。去年正是人工智能火热的时候&#xff0c;看着各种高薪招聘&#xff0c;我沉寂很久的内心也火热起来了。但是想归想&#xff0c;我内…

用python可以处理xml文件怎么打开_Python大神都是这样处理xml文件的!

最近有同学询问如何利用 Python 处理 xml 文件&#xff0c;特此整理一个比较简洁的操作手册&#xff0c;供大家参阅。首先准备一个xml文件&#xff0c;xml中的内容如下所示。存储为&#xff1a;student.xml如果要获取这个xml里面的数据&#xff0c;我们需要利用Python里面Eleme…

C# 使用 CancellationTokenSource 终止线程

我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止&#xff0c;其实使用CancellationTokenSource来进行控制更为好用&#xff0c;下面我们将介绍CancellationTokenSource相关用法。C# 使用 CancellationTokenSource 终止线程使用CancellationTokenSo…

编写一个程序,将一串字符倒序存放后输出。

源代码&#xff1a; 1 #include<iostream>2 using namespace std;3 int main()4 {5 char *p;int i,n;6 cout<<"请输入字符串的长度n";cin>>n;7 pnew char[n];8 for(i0;i<n;i)9 cin>>p[i]; 10 for(i0;i<n/…

下学期计算机教学工作计划,初中信息技术下学期教学工作计划

关键字&#xff1a; 计划信息技术教育是现代教育的主要教育之一&#xff0c;又是教师运用现代技术的指导性手段&#xff0c;现在如何提高自身素质来适应现代教育的需要&#xff0c;是我们每位老师思考的问题。如何培养学生[此文转于斐斐课件园 FFKJ.Net]对计算机的兴趣和意识&a…

超好看的科学科普书,孩子大人都可以看!

科学就是高不可攀的吗&#xff1f;科学探究就是神秘而枯燥的吗&#xff1f;科学教育就是“板着面孔”的吗&#xff1f;才不是呢&#xff01;小木认为科学研究是一个充满快乐的过程。而且&#xff0c;科学是无处不在的&#xff0c;日常生活中的点点滴滴也蕴含着科学原理。小木关…

WPF 制作便携小空调

今天看到群里一个小页面挺有意思的&#xff0c;就是这个&#xff1a;https://ac.yunyoujun.cn/于是想着用wpf也模仿一下嘿嘿&#xff0c;为了方便&#xff0c;也顾不上什么代码结构了。。。看看效果吧&#xff1a;代码不多&#xff0c;只有一个窗口&#xff0c;下面就直接看看代…

ecg信号越界_精确心电图ECG信号处理的简单介绍

心电图(ECG)是用来捕捉心脏在一段时间内情况的反映&#xff0c;它通过外部电极连接到皮肤转换成电信号来采集。心脏外面形成的每个细胞膜都有一个关联电荷&#xff0c;它在每次心跳期间去极化。它以微小电信号的形式出现在皮肤上&#xff0c;可以通过心电图探测到并放大显示。本…

Cloudstack部署

近几天一直在玩cloudstack3.0&#xff0c;目前添加host一直不成功&#xff0c;还在继续摸索中&#xff0c;有了解的朋友可以回复交流转载于:https://blog.51cto.com/vfans/912405

奥的斯服务器状态显示,奥的斯电梯调试服务器(俗称st)按键介绍

st的前面板由一个显示两行每行可显示16个字符的液晶显示和16个按键组成。st的16个按键分两个部分&#xff1a;左边竖的4个&#xff1a;module 在服务工具软件的任何地方返回到服务工具主菜单.function 在系统中的任何位置返回到安装和维修功能菜单供选择系统set 在功能中的任何…

ML.NET 示例:将ML.NET模型导出到ONNX

在这个示例中&#xff0c;您将看到如何使用ML.NET来训练回归模型&#xff0c;然后将该模型转换为ONNX格式。问题开放式神经网络交换即ONNX是一种表示深度学习模型的开放格式。使用ONNX&#xff0c;开发人员可以在最先进的工具之间移动模型&#xff0c;并选择最适合他们的组合。…

别写代码了!行吗?

全世界有3.14 % 的人已经关注了数据与算法之美01刚才等红绿灯的时候&#xff0c;天开始下雨了。这时候旁边的程序员首先开口说&#xff1a;“下雨了。”大概过了5秒钟&#xff0c;其他人&#xff1a;对哦&#xff0c;有点下雨了。其实&#xff0c;这说的是程序员头秃的故事。02…

dma接收双缓存 stm32_「STM32学习笔记」USART 新特性

之前的学习笔记“SPI不够用&#xff1f;USART来帮忙”一文中介绍了用如何把USART当做SPI来用的方法。此外&#xff0c;ST的USART还有很多新特性&#xff0c;没准有你不知道的。在此&#xff0c;我们整理出来以下串口新特性&#xff0c;供大家参考。支持RXD和TXD管脚互换很多时候…

二狗叫你制作千M网线的线序及方法

千兆5类或超5类双绞线的形式与百兆网线的形式相同&#xff0c;也分为直通和交叉两种。直通网线与我们平时所使用的没有什么差别&#xff0c;都是一一对应的。但是传统的百兆网络只用到4根线缆来传输&#xff0c;而千兆网络要用到8根来传输&#xff0c;所以千兆交叉网线的制作与…