博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core的身份认证框架IdentityServer4--(2)API跟WEB端配置
阅读量:5307 次
发布时间:2019-06-14

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

API配置

可以使用ASP.NET Core Web API模板。同样,我们建议您控制端口并使用与之前一样的方法来配置Kestrel和启动配置文件。端口配置为http://localhost:5001

在项目Api中添加一个IdentityController控制器代码如下:

[Route("identity")][Authorize]public class IdentityController : ControllerBase{    [HttpGet]    public IActionResult Get()    {        return new JsonResult(from c in User.Claims select new { c.Type, c.Value });    }}

稍后将使用此控制器来测试授权要求,并通过API返回的数据显示身份声明。

配置AccessTokenValidation

添加NuGet包IdentityServer4.AccessTokenValidation到项目中

更新Startup.cs代码如下:

namespace API{    public class Startup    {        public Startup(IConfiguration configuration)        {            Configuration = configuration;        }        public IConfiguration Configuration { get; }        // This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)        {            services.AddMvcCore()               .AddAuthorization()//添加身份验证服务               .AddJsonFormatters();            //AddAuthentication将身份验证服务添加到DI并配置"Bearer"为默认方案            services.AddAuthentication("Bearer")                    .AddIdentityServerAuthentication(options =>                    {                        options.Authority = "http://localhost:5000";//identifyServer服务地址                        options.RequireHttpsMetadata = false;//是否使用https                        options.ApiName = "api1";//进行身份验证的API资源的名称                    });        }        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            //将身份验证中间件添加到管道中            app.UseAuthentication();            app.UseMvc();        }    }}

AddAuthentication将认证服务添加到DI并配置"Bearer"为默认方案。AddIdentityServerAuthenticationIdentityServer访问令牌验证处理程序添加到DI以供验证服务使用。 UseAuthentication将认证中间件添加到请求管道中,以便每次调用主机时自动执行认证。

如果您使用浏览器导航到控制器(http://localhost:5001/identity),则应该获得401状态码。这意味着您的API需要一个凭证。

就是这样,API现在由IdentityServer保护。

 WEB配置

最后一步是编写一个客户端请求访问令牌,然后使用此令牌访问该API。

IdentityServer中的令牌端点实现了OAuth 2.0协议,您可以使用原始HTTP访问它。然而,我们有一个名为IdentityModel的客户端库,它将协议交互封装在易于使用的API中。

官方源码参考地址:将 NuGet包IdentityModel添加到您的应用程序。

 

IdentityModel包含一个用于发现端点的客户端库。这样你只需要知道IdentityServer的访问地址 - 实际的端点地址可以从元数据中读取

// 从元数据中发现端口var disco = await DiscoveryClient.GetAsync("http://localhost:5000");if (disco.IsError){    Console.WriteLine(disco.Error);    return;}

接着你可以使用 TokenClient 来请求令牌。为了创建一个该类型的实例,你需要传入令牌端点地址、客户端id和密码。

然后你可以使用 RequestClientCredentialsAsync 方法来为你的目标 API 请求一个令牌:

// 请求令牌var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");if (tokenResponse.IsError){    Console.WriteLine(tokenResponse.Error);    return;}Console.WriteLine(tokenResponse.Json);

最后调用API。

为了发送访问令牌到 API,你一般要使用 HTTP 授权 header。这可以通过 SetBearerToken 扩展方法来实现:

// 调用apivar client = new HttpClient();client.SetBearerToken(tokenResponse.AccessToken);var response = await client.GetAsync("http://localhost:5001/identity");if (!response.IsSuccessStatusCode){    Console.WriteLine(response.StatusCode);}else{    var content = await response.Content.ReadAsStringAsync();    Console.WriteLine(JArray.Parse(content));}

依次启动项目QuickstartIdentityServer、API、WEB

最后查看输出结果

注意:默认情况下,访问令牌将包含关于作用域,生命周期(nbf和exp),客户端ID(client_id)和发行者名称(iss)的声明。

 

转载于:https://www.cnblogs.com/miskis/p/8037721.html

你可能感兴趣的文章
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
iframe的父子层跨域 用了百度的postMessage()方法
查看>>
图片生成缩略图
查看>>
动态规划 例子与复杂度
查看>>
查看oracle数据库的连接数以及用户
查看>>
【数据结构】栈结构操作示例
查看>>
中建项目环境迁移说明
查看>>
三.野指针和free
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>