欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

IdentityServer4實(shí)現(xiàn).Net Core API接口權(quán)限認(rèn)證(快速入門)

 更新時(shí)間:2020年03月25日 15:07:03   作者:跳躍的鍵盤手  
這篇文章主要介紹了IdentityServer4實(shí)現(xiàn).Net Core API接口權(quán)限認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

什么是IdentityServer4

官方解釋:IdentityServer4是基于ASP.NET Core實(shí)現(xiàn)的認(rèn)證和授權(quán)框架,是對(duì)OpenID Connect和OAuth 2.0協(xié)議的實(shí)現(xiàn)。

通俗來(lái)講,就是服務(wù)端對(duì)需要認(rèn)證授權(quán)的資源(客戶端請(qǐng)求資源)在外層使用IdentityServer4框架進(jìn)行封裝加殼,用戶只能通過(guò)獲取IdentityServer4頒發(fā)的Token令牌才能進(jìn)行資源訪問(wèn)。

下面開(kāi)始進(jìn)入正題,如何快速搭建實(shí)現(xiàn)API接口鑒權(quán)。

準(zhǔn)備:1.下載準(zhǔn)備NetCore sdk環(huán)境

2.本文開(kāi)發(fā)環(huán)境為VS2019,部分代碼可能和之前的版本不同。

第一步,新建權(quán)限認(rèn)證服務(wù)項(xiàng)目,本文以Net Core API項(xiàng)目模板為例(也可以選擇其他模板)

第二步,添加IdentityServer4 Nuget程序包。不同版本依賴的NetCoe sdk環(huán)境不同,需手動(dòng)選擇合適版本。

這里提醒一下,有些同學(xué)的系統(tǒng)可能添加Nuget程序包時(shí),發(fā)現(xiàn)無(wú)法找到程序包。我們這里找出了解決方法,點(diǎn)擊Nuget程序包添加頁(yè)面的右上角設(shè)置按鈕,看到如下頁(yè)面,手動(dòng)添加如下的nuget.org,然后重新搜索即可。

第三步,添加IdentityServer4配置管理類。本文以用戶密碼授權(quán)模式為例。

public class Config
  {
    /// <summary>
    /// 定義資源范圍
    /// </summary>
    public static IEnumerable<ApiResource> GetApiResources()
    {
      return new List<ApiResource>
      {
        new ApiResource("api1", "我的第一個(gè)API")
      };
    }

    /// <summary>
    /// 定義訪問(wèn)的資源客戶端
    /// </summary>
    /// <returns></returns>
    public static IEnumerable<Client> GetClients()
    {
      return new List<Client>
      {
        new Client{
          ClientId="client",//定義客戶端ID
          ClientSecrets=
          {
            new Secret("secret".Sha256())//定義客戶端秘鑰
          },
          AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,//授權(quán)方式為用戶密碼模式授權(quán),類型可參考GrantTypes枚舉
          AllowedScopes={ "api1"}//允許客戶端訪問(wèn)的范圍

        }
       };
    }

    /// <summary>
    /// 這個(gè)方法是來(lái)規(guī)范tooken生成的規(guī)則和方法的。一般不進(jìn)行設(shè)置,直接采用默認(rèn)的即可。
    /// </summary>
    /// <returns></returns>
    public static IEnumerable<IdentityResource> GetIdentityResources()
    {
      return new IdentityResource[]
      {
        new IdentityResources.OpenId()
      };
    }
  }

第四步,Startup啟動(dòng)類中注冊(cè)服務(wù)中間件

// This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddIdentityServer()//注冊(cè)服務(wù)
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())//配置類定義的授權(quán)范圍
        .AddInMemoryClients(Config.GetClients())//配置類定義的授權(quán)客戶端
        .AddTestUsers(new List<TestUser> { new TestUser { Username = "Admin", Password = "123456", SubjectId = "001", IsActive = true } });//模擬測(cè)試用戶,這里偷懶了,用戶可以單獨(dú)管理,最好不要直接在這里New
      services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }

      app.UseIdentityServer();//添加中間件
      
      app.UseHttpsRedirection();

      app.UseRouting();

      app.UseAuthorization();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
      });
    }

應(yīng)用程序默認(rèn)的端口號(hào)有兩種:1.http://localhost:5000 2.https://localhost:5001.

到這里,Identityserver4鑒權(quán)服務(wù)已經(jīng)簡(jiǎn)單搭建完成。我們直接在VS中啟動(dòng)項(xiàng)目。并在端口號(hào)后面加上/.well-known/openid-configuration,出現(xiàn)如下頁(yè)面則表示配置成功。

第五步,PostMan模擬請(qǐng)求獲取token(當(dāng)然這一步非必須,對(duì)postman感興趣的同學(xué)可以試一試)

我們都知道IdentityServer4需要客戶端先訪問(wèn)鑒權(quán)服務(wù)獲取token令牌,才能進(jìn)一步訪問(wèn)加權(quán)的服務(wù)器資源。我們這里先通過(guò)PostMan模擬客戶端請(qǐng)求,獲取Token。(postman工具大家可以網(wǎng)上下載,也可以使用谷歌自帶的postman插件)

1.使用postman請(qǐng)求token時(shí),有個(gè)地方需要注意下:

很多同學(xué)在使用https請(qǐng)求時(shí),即請(qǐng)求https://localhost:5001,會(huì)發(fā)現(xiàn)無(wú)法成功。因?yàn)閜ostman默認(rèn)把SSL證書認(rèn)證打開(kāi)了,我們可以手動(dòng)關(guān)閉掉。找到postman頁(yè)面右上方的小扳手圖標(biāo),進(jìn)入設(shè)置頁(yè)面找到ssl關(guān)掉即可。當(dāng)然同學(xué)們直接使用http://localhost:5000請(qǐng)求就無(wú)需設(shè)置SSL.

2.請(qǐng)求參數(shù)

這里的參數(shù)value就是我們?cè)阼b權(quán)服務(wù)配置類設(shè)置的client和TestUser信息。

Grant_Type為授權(quán)類型,本文我們使用的是用戶密碼模式,所以這里填password.

這里我們看到,我們已成功模擬請(qǐng)求獲取了Token。大功告成,鑒權(quán)服務(wù)已驗(yàn)證可用,我們趕緊去發(fā)布部署吧。

第六步,鑒權(quán)服務(wù)發(fā)布部署。

.Net Core發(fā)布模式有三種:

1.框架依賴+可移植

2.框架依賴+運(yùn)行時(shí)環(huán)境(帶可執(zhí)行程序exe)

3.獨(dú)立部署

簡(jiǎn)單來(lái)說(shuō),框架依賴模式發(fā)布的程序包,都需要部署環(huán)境自帶.net core等運(yùn)行環(huán)境;而獨(dú)立部署則不需要考慮,發(fā)布包已經(jīng)包含了運(yùn)行環(huán)境,直接部署即可。

下面本文以框架依賴+可移植發(fā)布,做簡(jiǎn)單介紹。

發(fā)布完成后,我們會(huì)在發(fā)布路徑中看到程序dll.我們找到發(fā)布路徑,通過(guò)CMD命令窗口:dotnet xxx.dll可直接啟動(dòng)。

如上,則表示啟動(dòng)成功。(如果其他發(fā)布模式,直接雙擊發(fā)布包中可執(zhí)行exe文件即可啟動(dòng))

鑒權(quán)服務(wù)部署完成后,我們API接口如何使用呢,下面開(kāi)始正式介紹。

第一步:新建Web Api項(xiàng)目

添加Nuget程序包

第二步:配置啟動(dòng)類

public void ConfigureServices(IServiceCollection services)
    {
      //注冊(cè)服務(wù)
      services.AddAuthentication("Bearer")
        .AddIdentityServerAuthentication(x =>
        {
          x.Authority = "http://localhost:5000";//鑒權(quán)服務(wù)地址
          x.RequireHttpsMetadata = false;
          x.ApiName = "api1";//鑒權(quán)范圍
        });
      services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }
      app.UseAuthentication();//添加鑒權(quán)認(rèn)證
      app.UseHttpsRedirection();
      app.UseRouting();
        app.UseAuthorization();
      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
      }); 
    }

應(yīng)用程序默認(rèn)的端口號(hào)有兩種:1.http://localhost:5000 2.https://localhost:5001.為了避免端口號(hào)沖突被占用,我們可以在Program類中修改應(yīng)用程序啟動(dòng)端口號(hào)。

public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
      
        .ConfigureWebHostDefaults(webBuilder =>
        {
          webBuilder.UseUrls("http://*:5555");//設(shè)置啟動(dòng)端口號(hào)
          webBuilder.UseStartup<Startup>();
        });

第三步:創(chuàng)建API DEMO

[Route("api/[controller]")]
  [ApiController]
  public class TestController : ControllerBase
  {
    // GET: api/Test
    /// <summary>
    /// 方法加權(quán)
    /// </summary>
    /// <returns></returns>
    [Authorize]
    [HttpGet]
    public IEnumerable<string> Get()
    {
      return new string[] { "value1", "value2" };
    }

    /// <summary>
    /// 方法未加權(quán) 可直接訪問(wèn)
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    // GET: api/Test/5
    [HttpGet("{id}", Name = "Get")]
    public string Get(int id)
    {
      return "value";
    }

    /// <summary>
    /// 開(kāi)放獲取token API 接口
    /// </summary>
    /// <returns></returns>
    [HttpGet("GetToken")]
    public async Task<string> GetToken()
    {
      var client = new HttpClient();
      var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
      {
        Address = "http://localhost:5000/connect/token",
        ClientId = "client",
        ClientSecret = "secret",
        Scope = "api1",
        UserName = "Admin",
        Password = "123456",
      });

      if (tokenResponse.IsError)
      {
        return tokenResponse.Error;
      }

      return tokenResponse.AccessToken;

    }
  }

1.接口方法上加上:

[Authorize]

相當(dāng)于對(duì)接口加權(quán),只有被授權(quán)的用戶才能訪問(wèn)(即獲取token的用戶)。此時(shí)上文中接口api/Test由于被加權(quán),請(qǐng)求時(shí)會(huì)報(bào)錯(cuò);但是api/Test/1接口未加權(quán),仍可正常請(qǐng)求。

那么我們?nèi)绾尾拍茉L問(wèn)被加權(quán)的接口呢???Go Next

2.我們這里開(kāi)放了獲取Token的接口GetToken(類似于上文中通過(guò)PostMan獲取Token)

訪問(wèn)被加權(quán)的API接口,我們這里需要先請(qǐng)求獲取Token,然后請(qǐng)求加權(quán)接口時(shí)帶上token參數(shù)。

3.請(qǐng)求加權(quán)接口

請(qǐng)求加權(quán)接口時(shí)帶上Token,接口請(qǐng)求成功!

OK,關(guān)于如何快速開(kāi)發(fā)和調(diào)試基于IdentityServer4框架的API接口鑒權(quán)服務(wù),至此我們已介紹完畢。

小弟不才,本文中有考慮不周全或錯(cuò)誤的地方,歡迎大家指正。

(如果有的同學(xué)想通過(guò)IIS部署API應(yīng)用程序,這里有個(gè)地方需要注意下,需要在IIS(功能視圖——模塊)中添加AspNetCoreModule模塊。具體原因本文就不在這里介紹了。)

到此這篇關(guān)于IdentityServer4實(shí)現(xiàn).Net Core API接口權(quán)限認(rèn)證(快速入門)的文章就介紹到這了,更多相關(guān).Net Core API權(quán)限認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ASP.NET?MVC實(shí)現(xiàn)登錄后跳轉(zhuǎn)到原界面

    ASP.NET?MVC實(shí)現(xiàn)登錄后跳轉(zhuǎn)到原界面

    這篇文章介紹了ASP.NET?MVC實(shí)現(xiàn)登錄后跳轉(zhuǎn)到原界面的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 讓VS2008對(duì)JQuery語(yǔ)法的智能感知更完美一點(diǎn)

    讓VS2008對(duì)JQuery語(yǔ)法的智能感知更完美一點(diǎn)

    上周Rich Strahl的POST中提到一個(gè)新發(fā)布的VS2008 hotfix修復(fù)了VS2008對(duì)Javascript智能感知的一些BUG,fixed之后可以讓VS2008對(duì)JQuery提供智能感知,讓我等JQuery fans欣喜了一陣子??勺屑?xì)一看,還需要另外給JQuery添加上XML comments才行 :( 喪氣了...  
    2008-03-03
  • System.Timers.Timer定時(shí)執(zhí)行程序示例代碼

    System.Timers.Timer定時(shí)執(zhí)行程序示例代碼

    如果是某個(gè)邏輯功能的定時(shí),可以將code放到邏輯功能的類的靜態(tài)構(gòu)造函數(shù)中,在該邏輯類第一次執(zhí)行時(shí),靜態(tài)構(gòu)造函數(shù)會(huì)被調(diào)用,則定時(shí)自然啟動(dòng)
    2013-06-06
  • 一個(gè)ASP.NET的MYSQL的數(shù)據(jù)庫(kù)操作類自己封裝的

    一個(gè)ASP.NET的MYSQL的數(shù)據(jù)庫(kù)操作類自己封裝的

    這篇文章主要介紹了一個(gè)ASP.NET的MYSQL的數(shù)據(jù)庫(kù)操作類自己封裝的,在數(shù)據(jù)庫(kù)操作類中的連接字符串中記得加上charset=utf8 需要的朋友可以參考下
    2014-08-08
  • asp.net MVC下使用rest的方法

    asp.net MVC下使用rest的方法

    本篇文章主要介紹了asp.net MVC下使用rest的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 詳解在ASP.NET Core下使用SignalR技術(shù)

    詳解在ASP.NET Core下使用SignalR技術(shù)

    本篇文章主要介紹了在ASP.NET Core下使用SignalR技術(shù) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • asp.net 網(wǎng)頁(yè)編碼自動(dòng)識(shí)別代碼

    asp.net 網(wǎng)頁(yè)編碼自動(dòng)識(shí)別代碼

    另外一位網(wǎng)友空間/IV提供的代碼,功能同HttpWebRequest獲取網(wǎng)頁(yè)源代碼時(shí)自動(dòng)識(shí)別網(wǎng)頁(yè)編碼
    2008-09-09
  • asp.net實(shí)現(xiàn)輸出xml的方法

    asp.net實(shí)現(xiàn)輸出xml的方法

    這篇文章主要介紹了asp.net實(shí)現(xiàn)輸出xml的方法,涉及asp.net針對(duì)xml節(jié)點(diǎn)的查詢、創(chuàng)建、修改、生成等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Asp.net 無(wú)限級(jí)分類實(shí)例代碼

    Asp.net 無(wú)限級(jí)分類實(shí)例代碼

    近期做的一個(gè)網(wǎng)站需要一個(gè)無(wú)限級(jí)下拉列表的無(wú)限級(jí)分級(jí)功能,于是就有了下面的小作品。 開(kāi)始以為無(wú)限級(jí)下拉列表功能應(yīng)該很簡(jiǎn)單,無(wú)非就是用一個(gè)遞歸算法就好啦,但是在做起來(lái)的時(shí)候卻會(huì)遇到一些比較模糊的東西。
    2008-07-07
  • 淺談Asp.net Mvc之Action如何傳多個(gè)參數(shù)的方法

    淺談Asp.net Mvc之Action如何傳多個(gè)參數(shù)的方法

    本篇文章主要介紹了Asp.net Mvc之Action如何傳多個(gè)參數(shù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-08-08

最新評(píng)論