identityserver4實現(xiàn)單點登錄統(tǒng)一認證
什么是单点登录同一认证?
多个应用共用一套登录系统,用户只需要在其中一个应用登录就获得了ids4授权,无需多次登录其它应用。
下面介绍简单的demo实现:
1.数据库
新建为,然后在下面新建表,表结构如下图所示
2.搭建服务端
准备工具:以上、
新建项目
名字为
依赖项-管理程序包,找到包,选择版本为2.2.0
设置该项目地址为:http://localhost:5000
新建一个cs文件为Config代码如下:
publicclassConfig{//scopesdefinetheresourcesinyoursystempublicstaticIEnumerableIdentityResourceGetIdentityResources(){returnnewListIdentityResource{newIdentityResources.OpenId(),newIdentityResources.Profile(),};}//clientswanttoaccessresources(akascopes)publicstaticIEnumerableClientGetClients(){returnnewListClient{//OpenIDConnect隐式流客户端(MVC)newClient{ClientId="mvc",ClientName="MVCClient",AllowedGrantTypes=GrantTypes.Implicit,//隐式方式RequireConsent=false,//如果不需要显示否同意授权页面这里就设置为falseRedirectUris={"http://localhost:5002/signin-oidc"},//登录成功后返回的客户端地址PostLogoutRedirectUris={"http://localhost:5002/signout-callback-oidc"},//注销登录后返回的客户端地址AllowedScopes=//下面这两个必须要加吧不太明白啥意思{IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile}}};}}
在Startup.cs的ConfigureServices方法中注入Ids4服务,如下面部分代码:
publicvoidConfigureServices(IServiceCollectionservices){services.AddDbContextEFContext(options=options.UseSqlServer(Configuration.GetConnectionString("conn")));//注入DbContextservices.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);services.AddIdentityServer()//Ids4服务.AddDeveloperSigningCredential().AddInMemoryIdentityResources(Config.GetIdentityResources()).AddInMemoryClients(Config.GetClients());//把配置文件的Client配置资源放到内存services.AddTransientIAdminService,AdminService//service注入}
在Startup.cs的Configure方法中添加ids4服务中间件(注意要放在UseMvc之前就可以):
app.UseIdentityServer();
至此ids4配置好,接下来是数据库连接,添加DbContext类名字为:EFContext.cs
publicclassEFContext:DbContext{publicEFContext(DbContextOptionsEFContextoptions):base(options){}#region实体集publicDbSetAdminAdmin{get;set;}//注意这里这个Blog不能写成Blogs否则会报错找不到Blogs因为我们现在数据库和表是现成的这里就相当于实体对应的数据库是Blog#endregion}
添加一个Admin.cs的实体类,对应数据库里面的用户表Admin
publicclassAdmin{publicintId{get;set;}publicDateTimeCreateDate{get;set;}publicstringUserName{get;set;}publicstringPassword{get;set;}publicstringRemark{get;set;}}
接下来写service层,.netcore为依赖注入,所以要以接口的形式在service层
新建一个接口:IAdminService.cs代码如下:
publicinterfaceIAdminService:IBaseServiceAdmin{TaskAdminGetByStr(stringusername,stringpwd);}
新建实现该接口的类AdminService.cs代码如下:
publicclassAdminService:BaseServiceAdmin,IAdminService{publicAdminService(EFContext_efContext){db=_efContext;}publicasyncTaskAdminGetByStr(stringusername,stringpwd){Adminm=awaitdb.Admin.Where(a=a.UserName==usernamea.Password==pwd).SingleOrDefaultAsync();if(m!=null){returnm;}else{returnnull;}}}
BaseService代码如下:
publicclassBaseServiceTwhereT:class,new(){publicEFContextdb;///summary///增////summary///paramname="entity"/param///returns/returnspublicasyncTaskboolAdd(Tentity){awaitdb.SetT().AddAsync(entity);returndb.SaveChanges()}///summary///删////summary///paramname="entity"/param///returns/returnspublicasyncTaskboolDel(Tentity){db.Entry(entity).State=EntityState.Deleted;inti=awaitdb.SaveChangesAsync();returni}///summary///改////summary///paramname="entity"/param///returns/returnspublicasyncTaskboolEdit(Tentity){db.Entry(entity).State=EntityState.Modified;inti=awaitdb.SaveChangesAsync();returni}///summary///查-根据传进来的lambda表达式查询一条数据////summary///paramname="whereLambda"/param///returns/returnspublicasyncTaskTGet(System.Linq.Expressions.ExpressionFuncT,boolwhereLambda){Tt=awaitdb.SetT().Where(whereLambda).SingleOrDefaultAsync();returnt;}///summary///查询多条数据-根据传进来的lambda和排序的lambda查询////summary///typeparamname="s"/typeparam///paramname="pageIndex"/param///paramname="pageSize"/param///paramname="whereLambda"/param///paramname="orderbyLambda"/param///paramname="isAsc"/param///returns/returnspublicasyncTaskListTGetLists(intpageIndex,intpageSize,System.Linq.Expressions.ExpressionFuncT,boolwhereLambda,System.Linq.Expressions.ExpressionFuncT,sorderbyLambda,boolisAsc){vartemp=db.SetT().Where(whereLambda);ListTlist=null;if(isAsc)//升序{list=awaittemp.OrderBy(orderbyLambda).Skip((pageIndex-1)*pageSize).Take(pageSize).ToListAsync();}else//降序{list=awaittemp.OrderByDescending(orderbyLambda).Skip((pageIndex-1)*pageSize).Take(pageSize).ToListAsync();}returnlist;}///summary///获取总条数////summary///paramname="whereLambda"/param///returns/returnspublicasyncTaskintGetTotalCount(ExpressionFuncT,boolwhereLambda){returnawaitdb.SetT().Where(whereLambda).CountAsync();}}
IBaseService代码如下:
publicinterfaceIBaseServiceTwhereT:class,new(){//增TaskboolAdd(Tentity);//删TaskboolDel(Tentity);//改TaskboolEdit(Tentity);//查TaskTGet(System.Linq.Expressions.ExpressionFuncT,boolwhereLambda);//查询分页TaskListTGetLists(intpageIndex,intpageSize,System.Linq.Expressions.ExpressionFuncT,boolwhereLambda,System.Linq.Expressions.ExpressionFuncT,sorderbyLambda,boolisAsc);//获取总条数TaskintGetTotalCount(ExpressionFuncT,boolwhereLambda);}
在Startup.cs的ConfigureServices方法中注入service层上面已经注入过...
在配置文件appsettings.json中添加数据库连接字符串如下代码:
{"ConnectionStrings":{"conn":"server=.;database=blogcore;uid=sa;pwd=123456"},"Logging":{"LogLevel":{"Default":"Warning"}},"AllowedHosts":"*"}
接下来做统一认证服务的登录页,新增一个控制器AccountController,代码如下:
publicclassAccountController:Controller{privateIAdminService_adminService;//自己写的操作数据库Admin表的serviceprivatereadonlyIIdentityServerInteractionService_interaction;privatereadonlyIClientStore_clientStore;privatereadonlyIAuthenticationSchemeProvider_schemeProvider;privatereadonlyIEventService_events;publicAccountController(IIdentityServerInteractionServiceinteraction,IClientStoreclientStore,IAuthenticationSchemeProviderschemeProvider,IEventServiceevents,IAdminServiceadminService){_interaction=interaction;_clientStore=clientStore;_schemeProvider=schemeProvider;_events=events;_adminService=adminService;}///summary///登录页面////summary[HttpGet]publicasyncTaskIActionResultLogin(stringreturnUrl=null){ViewData["returnUrl"]=returnUrl;returnView();}///summary///登录post回发处理////summary[HttpPost]publicasyncTaskIActionResultLogin(stringuserName,stringpassword,stringreturnUrl=null){ViewData["returnUrl"]=returnUrl;Adminuser=await_adminService.GetByStr(userName,password);if(user!=null){AuthenticationPropertiesprops=newAuthenticationProperties{IsPersistent=true,ExpiresUtc=DateTimeOffset.UtcNow.Add(TimeSpan.FromDays(1))};awaitHttpContext.SignInAsync(user.Id.ToString(),user.UserName,props);if(returnUrl!=null){returnRedirect(returnUrl);}returnView();}else{returnView();}}}
Login视图代码如下:
@{Layout=null;}!DOCTYPEhtmlhtmlheadmetaname="viewport"content="width=device-width"/titleLogin/title/headbodydivalign="center"h1统一认证登录中心/h1formaction="/Account/Login"method="post"用户名:inputtype="text"name="userName"/br/密码:inputtype="password"name="password"/inputtype="hidden"name="returnUrl"value="@ViewData["returnUrl"]"/br/inputtype="submit"value="登录"http://form/div/body/html
至此,IdentityServer4服务端的工作完成,接下来我们要开始建客户端了,也就是需要保护的MVC网站
3.搭建客户端
新建一个名为MvcClient的ASP.NetCoreWeb应用程序
把地址设置为:http://localhost:5002
在Startup.cs的ConfigureServices方法中添加如下部分代码(主要用来配置认证中心ids4的及自己作为客户端的认证信息):
publicvoidConfigureServices(IServiceCollectionservices){JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();services.AddAuthentication(options={options.DefaultScheme="Cookies";options.DefaultChallengeScheme="oidc";}).AddCookie("Cookies").AddOpenIdConnect("oidc",options={options.SignInScheme="Cookies";options.Authority="http://localhost:5000";options.RequireHttpsMetadata=false;options.ClientId="mvc";options.SaveTokens=true;});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}
在Configure方法中添加这行代码(需要在UseMvc之前就可以):
app.UseAuthentication();
到此,客户端跟统一认证的信息就配置完了。接下来我们把Home控制器上面加上需要验证的标志:[Authorize]
我们把默认的Index视图页面html代码去掉,改成如下(主要用来显示下授权后拿到的用户信息):
@{ViewData["Title"]="HomePage";}divalign="center"h1这里是受保护的客户端首页/h1/divh3Userclaims/h3dl@foreach(varclaiminUser.Claims){dt@claim.Type/dtdd@claim.Value/dd}/dl
到此,客户端的工作也做完了,下面我们要开始启动项目了,设置项目为多项目启动:解决方案上右键-属性
现在我们启动项目:服务器项目和客户端都运行了,但是客户端会直接跳转到服务端登录页面
比如我们如果访问受保护的5002端口资源,如果用户没有登录会直接跳到5000端口的统一认证服务登录页
人说,如果你很想要一样东西,就放它走。如果它回来找你,那么它永远都是你的。要是它没有回来,那么不用再等了,因为它根本就不是你的。——伊恩·麦克尤恩
推薦系統(tǒng)
雨林木風 winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類型:WinXP雨林木風在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國內(nèi)重裝系統(tǒng)行業(yè)知名品牌,雨林木風WindowsXP其系統(tǒng)口碑得到許多人認可,積累了廣大的用戶群體,是一款穩(wěn)定流暢的系統(tǒng),雨林木風 winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載,有需要的朋友速度下載吧。
系統(tǒng)等級:進入下載 >蘿卜家園win7純凈版 ghost系統(tǒng)下載 x64 聯(lián)想電腦專用
系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win7蘿卜家園win7純凈版是款非常純凈的win7系統(tǒng),此版本優(yōu)化更新了大量的驅(qū)動,幫助用戶們進行舒適的使用,更加的適合家庭辦公的使用,方便用戶,有需要的用戶們快來下載安裝吧。
系統(tǒng)等級:進入下載 >雨林木風xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載
系統(tǒng)大?。?/em>1.01GB系統(tǒng)類型:WinXP雨林木風xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載,雨林木風WinXP系統(tǒng)技術(shù)積累雄厚深耕多年,采用了新的系統(tǒng)功能和硬件驅(qū)動,可以更好的發(fā)揮系統(tǒng)的性能,優(yōu)化了系統(tǒng)、驅(qū)動對硬件的加速,加固了系統(tǒng)安全策略,運行環(huán)境安全可靠穩(wěn)定。
系統(tǒng)等級:進入下載 >蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 V2023 X64位系統(tǒng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win10蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國內(nèi)重裝系統(tǒng)行業(yè)的蘿卜家園品牌,(win10企業(yè)版,win10 ghost,win10鏡像),蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 ghost鏡像 X64位系統(tǒng)下載,其系統(tǒng)口碑得到許多人認可,積累了廣大的用戶群體,蘿卜家園win10純凈版是一款穩(wěn)定流暢的系統(tǒng),一直以來都以用戶為中心,是由蘿卜家園win10團隊推出的蘿卜家園
系統(tǒng)等級:進入下載 >蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 V2023 X64位系統(tǒng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win10蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 ghost X64位 系統(tǒng)下載,蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國內(nèi)重裝系統(tǒng)行業(yè)的蘿卜家園品牌,其系統(tǒng)口碑得到許多人認可,積累了廣大的用戶群體,蘿卜家園win10純凈版是一款穩(wěn)定流暢的系統(tǒng),一直以來都以用戶為中心,是由蘿卜家園win10團隊推出的蘿卜家園win10國內(nèi)鏡像版,基于國內(nèi)用戶的習慣,做
系統(tǒng)等級:進入下載 >windows11下載 蘿卜家園win11專業(yè)版 X64位 V2023官網(wǎng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win11蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,windows11下載 蘿卜家園win11專業(yè)版 X64位 官網(wǎng)正式版可以更好的發(fā)揮系統(tǒng)的性能,優(yōu)化了系統(tǒng)、驅(qū)動對硬件的加速,使得軟件在WINDOWS11系統(tǒng)中運行得更加流暢,加固了系統(tǒng)安全策略,WINDOWS11系統(tǒng)在家用辦公上跑分表現(xiàn)都是非常優(yōu)秀,完美的兼容各種硬件和軟件,運行環(huán)境安全可靠穩(wěn)定。
系統(tǒng)等級:進入下載 >
相關(guān)文章
- 有什么電腦自動關(guān)機軟件好用 電腦自動關(guān)機軟件下載推薦
- 微信抽獎小程序怎么弄,教你微信轉(zhuǎn)盤抽獎小程序制作方法
- 收集意見建議小程序怎么弄,教你制作匿名收集意見的小程序
- 掃碼助力活動怎么弄,微信公眾號助力活動的制作步驟
- 海報裂變活動怎么弄,微信公眾號生成海報裂變活動的方法
- 公眾號推廣二維碼怎么弄,微信公眾號推廣二維碼生成方法
- 公眾號裂變活動制作,微信公眾號怎么做裂變活動
- 登記信息二維碼制作,如何實現(xiàn)掃碼登記填報信息
- 登記表怎么弄,教你微信登記表格怎么做
- 參數(shù)二維碼怎么弄,微信公眾號帶參數(shù)二維碼怎么生成
- 報名二維碼怎么弄,微信公眾號報名二維碼制作步驟
- 設(shè)置電腦定時關(guān)機命令如何更改 電腦定時關(guān)機命令設(shè)置方法詳解
- win7怎么自動關(guān)機 win7自動關(guān)機時間設(shè)置方法
- 設(shè)置定時關(guān)機命令在哪 電腦設(shè)置定時關(guān)機命令
熱門系統(tǒng)
推薦軟件
推薦應(yīng)用
推薦游戲
熱門文章
常用系統(tǒng)
- 1win11最新娛樂版下載 技術(shù)員聯(lián)盟x64位 ghost系統(tǒng) ISO鏡像 v2023
- 2電腦公司windows7純凈版 ghost x64位 v2022.05 官網(wǎng)鏡像下載
- 3外星人系統(tǒng)Win11穩(wěn)定版系統(tǒng)下載 windows11 64位穩(wěn)定版Ghost V2022
- 4win11一鍵裝機小白版下載 外星人系統(tǒng) x64位純凈版下載 筆記本專用
- 5蘿卜家園Ghost win10 64位中文版專業(yè)版系統(tǒng)下載 windows10純凈專業(yè)版下載
- 6【國慶特別版】番茄花園Windows11高性能專業(yè)版ghost系統(tǒng) ISO鏡像下載
- 7青蘋果系統(tǒng) GHOST WIN7 SP1 X64 專業(yè)優(yōu)化版 V2024
- 8深度技術(shù)ghost win7純凈版最新下載 大神裝機版 ISO鏡像下載
- 9雨林木風windows11中文版免激活 ghost鏡像 V2022.04下載