数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

IdnentiyServer使用客户端凭据访问API的实例代码

来源:脚本之家  责任编辑:小易  

情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限。

客户端通过clientid和secrect访问identitserver的Token Endpoint,获取accesstoken;

接着客户端再使用accesstoken作为头部验证访问webapi。(webapi已经添加了identityserver的相关验证)。

代码实现:其中 "http://localhost:5000"是identityserver地址,"http://localhost:5001"是api地址

identityserver:在identityserver添加api和客户端,如下所示:定义了一个api1资源,client客户端。client客户端指定为ClientCredentials(客户端凭据)模式,并允许其访问api1。

public class Config
 {
  // scopes define the API resources in your system
  public static IEnumerable<ApiResource> GetApiResources()
  {
   return new List<ApiResource>
   {
    new ApiResource("api1", "My API")
   };
  }
  // clients want to access resources (aka scopes)
  public static IEnumerable<Client> GetClients()
  {
   // client credentials client
   return new List<Client>
   {
    new Client
    {
     ClientId = "client",
     AllowedGrantTypes = GrantTypes.ClientCredentials,
     ClientSecrets = 
     {
      new Secret("secret".Sha256())
     },
     AllowedScopes = { "api1" }
    }
   };
  }
 }

在startup配置identityserver如下:

public class Startup
 {
  public void ConfigureServices(IServiceCollection services)
  {
   // configure identity server with in-memory stores, keys, clients and scopes
   services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiResources(Config.GetApiResources())
    .AddInMemoryClients(Config.GetClients());
  }
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
   if (env.IsDevelopment())
   {
    app.UseDeveloperExceptionPage();
   }
   app.UseIdentityServer();
  }
 }

WebApi:在api添加identityserver的验证,代码如下,其中定义了同样的api名称,"http://localhost:5000"是identityserver的地址。

public class Startup
 {
  public void ConfigureServices(IServiceCollection services)
  {
   services.AddMvcCore()
    .AddAuthorization()
    .AddJsonFormatters();
   services.AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
    {
     options.Authority = "http://localhost:5000";
     options.RequireHttpsMetadata = false;
     options.ApiName = "api1";
    });
  }
  public void Configure(IApplicationBuilder app)
  {
   app.UseAuthentication();
   app.UseMvc();
  }
 }

 添加一个需要验证的控制器:

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

客户端:

这里使用里IdentityModel类库

实际请求如下:

1.获取accesstoken:http://localhost:5000/connect/token?client_id=client&client_secret=secret&grant_type=client_credentials&scope=api1

2.请求api1

http://localhost:5001/identity
Headers
Authorization:accesstoken

public class Program
 {
  public static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
  private static async Task MainAsync()
  {
    //获取identitserver的各个端点地址
   var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
   if (disco.IsError)
   {
    Console.WriteLine(disco.Error);
    return;
   }
   //获取具有api1访问权限的accesstoken
   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);
   Console.WriteLine("\n\n");
   //设置accesstoken为http请求头,并访问api1
   var 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));
   }
  }
 }

ps:

1.这里默认的accesstoken为jwt格式,客户端访问api时,api只需要在启动的时候访问identity获取秘钥即可。若为referencetoken,客户端访问api时,api需要授权访问的都会再请求一次identityserver,,而且api必须设置秘钥,client设置AccessTokenType属性为Reference。

2.可自定义AccessTokenLifetime(token存活时间),默认是3600秒,即一小时

总结

以上所述是小编给大家介绍的IdnentiyServer-使用客户端凭据访问API,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!


  • 本文相关:
  • 详解.net core中的数据保护组件
  • .net下的签名与混淆图文分析
  • 解析asp.net core中使用session的方法
  • asp.net mvc @helper辅助方法和@functons自定义函数的使用方法
  • asp.net cookie操作类
  • 在web用户控件中引用样式表中样式的方法
  • .net 单例模式(singleton)
  • 文本框中输入小写字母即时转换为大写实现思路
  • 关于vs2005、vs2008和vs2010项目互转的总结
  • 深入lumisoft.net组件开发碰到乱码等问题的解决方法
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved