博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证
阅读量:5241 次
发布时间:2019-06-14

本文共 5420 字,大约阅读时间需要 18 分钟。

原文:

内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证

作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址。

  在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序(需要有IdentityServer4),我们首先需要干什么呢?那就是搞一个UI,这样非常美观既可以看到我们的身份验证效果,那么IdentityServer官方已经给我们提供了一套UI了,我们从哪里可以获取呢?

  可以通过这个地址就行克隆安装到本地并附加到你的MVC程序中,。当然我们可以根据PowerShell 进行远程拉取(以下命令在项目根目录进行Code)

在Windows中我们的命令如下:

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/master/getmaster.ps1'))

或者在macOS或Linux上使用bash one-line:

\curl -L https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/master/getmaster.sh | bash

 下图所示是我在Windows Powershell中进行远程拉取的。

安装完项目中会添加一个Quickstart的这么一个文件夹,其中有IdentityServer给我们写好的代码,有控制器,模型,视图,静态文件等等。

当然还需要在Startup类中配置好你的MVC,这需要在ConfigureService里面将MVC添加到DI中并在Configure方法中将MVC中间件添加到管道上。

// This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)        {            services.AddMvc();            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();            services.AddAuthentication(options =>            {                options.DefaultScheme = "Cookies";                options.DefaultChallengeScheme = "oidc";            })  .AddCookie("Cookies")                .AddOpenIdConnect("oidc", options =>                {                    options.Authority = "http://localhost:5000";                    options.RequireHttpsMetadata = false;                    options.ClientId = "mvc";                    options.SaveTokens = true;                });        }

  首先我们通过 AddAuthentication 将身份验证服务添加到我们的DI中。其中参数有三个,第一个 DefaultScheme 它呢可以设置我们通过Cookies进行保存登录信息。那么后面是我们的 DefaultChallengeScheme ,它的参数是 oidc ,也就是因为当我们需要用户登录时,我们将使用OpenID Connect协议。然后 AddCookie ,我们使用添加可处理cookie的处理程序。最后, AddOpenIdConnect 用于配置执行OpenID Connect协议的处理程序。这 Authority 表明我们信任IdentityServer。然后我们通过 ClientId 。识别这个客户。  SaveTokens 用于在cookie中保留来自IdentityServer的令牌,同时我还关闭了JWT声明映射,这样会让我们的应用程序流畅地通过: JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 。

  最后,我们需要让我们的认证请求达到响应,应在管道中的MVC之前添加认证中间件。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            ///xxx//添加服务请求            app.UseAuthentication();       ///xxx        }

  为了触发验证,我们在 HomeController 中添加一个特性 [Authorize] 。还要修改该Action的View以显示用户的信息,例如:

@using Microsoft.AspNetCore.Authentication 
@foreach (var claim in User.Claims) {
@claim.Type
@claim.Value
}

Properties

@foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items) {
@prop.Key
@prop.Value
}

如果你现在启动的话,会出现内部错误,因为MVC客户端在认证平台服务器中并没有注册。

现在我们回到我们的认证服务中心,在Config.cs中添加如下代码(范围代表您想要保护的内容以及客户想要访问的内容。与OAuth相比,OIDC中的范围不代表API,而是代表用户ID,名称或电子邮件地址等身份数据。)

public static IEnumerable
GetIdentityResources() { return new List
{ new IdentityResources.OpenId(), new IdentityResources.Profile(), }; }

然后,您需要将这些身份资源添加到Startup.cs中的IdentityServer配置中。使用 AddInMemoryIdentityResources 扩展方法调用 AddIdentityServer() 。

public void ConfigureServices(IServiceCollection services)        {            // configure identity server with in-memory stores, keys, clients and scopes            services.AddIdentityServer()                .AddDeveloperSigningCredential()                .AddInMemoryIdentityResources(Config.GetIdentityResources())                .AddInMemoryApiResources(Config.GetSoluction())                .AddInMemoryClients(Config.GetClients())                //.AddTestUsers(Config.GetUsers());            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);        }

   最后一步是将MVC客户端的配置添加到IdentityServer。基于OpenID Connect的客户端与我们目前添加的OAuth 2.0客户端非常相似。但由于OIDC中的流程始终是交互式的,因此我们需要在配置中添加一些重定向URL。将以下内容添加到您的客户端配置:

public static IEnumerable
GetClients(){ return new List
{ // other clients omitted... // OpenID Connect implicit flow client (MVC) new Client { ClientId = "mvc", ClientName = "MVC Client", AllowedGrantTypes = GrantTypes.Implicit, // where to redirect to after login RedirectUris = { "http://localhost:5002/signin-oidc" }, // where to redirect to after logout PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" }, AllowedScopes = new List
{ IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile } } };}

 就这样我们启动项目,现在启动项目也就没有什么问题了。

 其中我们用到了IdentityServer的Quickstart,虽说已经写好了很多相关的控制器等等,这个Ui但是还是自己写个好,或者改造!

总结:这篇文章说明了Server和Client之间的配置关系,Client不用管Server,只需要知道 Authority 的地址,携带其中的 ClientId ,而Server中相比上一篇文章中我们多了 Client 里面有ClientId用于和Client端匹配,那么我们就可以存到数据库中!而Server端需要注入Client信息,通过 AddInMemoryClients 方法。当然你想到这里了,那么就一定可以介入QQ登录、微信登录了、后续的文章会写这些!

 

posted on
2019-01-29 08:25 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10332503.html

你可能感兴趣的文章
严重: 文档无效: 找不到语法。 at (null:2:19)
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
nodejs-Path模块
查看>>
P1107 最大整数
查看>>
EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...
查看>>
监控CPU和内存的使用
查看>>
Ubuntu14.04设置开机自启动程序
查看>>
ios app 单元测试 自动化测试
查看>>
强连通tarjan模版
查看>>
javascript_09-数组
查看>>
多进程与多线程的区别
查看>>
PAT 1145 1078| hashing哈希表 平方探测法
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
Linux第七周学习总结——可执行程序的装载
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
细说php(二) 变量和常量
查看>>
iOS开发网络篇之Web Service和XML数据解析
查看>>
个人寒假作业项目《印象笔记》第一天
查看>>
java 常用命令
查看>>