精品熟女碰碰人人a久久,多姿,欧美欧美a v日韩中文字幕,日本福利片秋霞国产午夜,欧美成人禁片在线观看

asp.net core MVC之實(shí)現(xiàn)基于token的認(rèn)證

asp.net core mvc之實(shí)現(xiàn)基于token的認(rèn)證

安裝nuget包

項(xiàng)目中添加包:dotnet add package microsoft.aspnetcore.authentication.jwtbearer

添加認(rèn)證配置

startup類中添加如下配置:

public void configureservices(iservicecollection services)
{
  ...
  services.addauthentication(defaultscheme: jwtbearerdefaults.authenticationscheme);
}

public void configure(iapplicationbuilder app, iwebhostenvironment env)
{
  ...
  app.useauthentication();
  app.useauthorization();
  app.useendpoints(endpoints =>
  {
      endpoints.mapcontrollers();
  }); 
}

addauthentication方法會(huì)向依賴注入容器添加認(rèn)證服務(wù)和它所使用的其他服務(wù),其參數(shù)defaultscheme用于指定當(dāng)未指定具體的認(rèn)證方案時(shí)將會(huì)使用的默認(rèn)方案,上例為bearer認(rèn)證。

addauthentication方法的另一重載能夠使用authenticationoptions類為認(rèn)證過程中的每一個(gè)動(dòng)作指明所使用的認(rèn)證方案,如defaultauthenticatescheme、
defaultchallengescheme、
defaultsigninscheme、
defaultsignoutscheme、
defaultforbidscheme。
如果沒有為這些屬性設(shè)置認(rèn)證方案,則將使用defaultscheme屬性所指定的值。

當(dāng)添加jwtbearer認(rèn)證方式時(shí),jwtbeareroptions對(duì)象能夠配置該認(rèn)證的選項(xiàng),它的tokenvalidationparameters屬性用于指定驗(yàn)證token時(shí)的規(guī)則:

var tokensection = configuration.getsection("security:token");
services.addauthentication(options => {
  options.defaultauthenticatescheme = jwtbearerdefaults.authenticationscheme;
  options.defaultchallengescheme = jwtbearerdefaults.authenticationscheme;
}).addjwtbearer(options => {
  options.tokenvalidationparameters = new tokenvalidationparameters{
      validateaudience = true,
      validatelifetime = true,
      validateissuer = true,
      validateissuersigningkey = true,
      validissuer = tokensection["issuer"],
      validaudience = tokensection["audience"],
      issuersigningkey = new symmetricsecuritykey(
          encoding.utf8.getbytes(tokensection["key"])
      ),
      clockskew = timespan.zero
  };
});

tokenvalidationparameters類作為token驗(yàn)證參數(shù)類,它包含了一些屬性,這些屬性如validateaudience、validateissuer、validatelifetime和validateissuersigningkey,它們都是布爾類型,用于指明是否驗(yàn)證相應(yīng)的項(xiàng);而validissuer和validaudience屬性則用于指明合法的簽發(fā)者(issuer)與接受方(audience)。在上例中,它們的值都從配置文件中獲取;issuersigningkey屬性的值用于指定進(jìn)行簽名驗(yàn)證的安全密鑰,它的值為symmetricsecuritykey對(duì)象,即對(duì)稱加密密鑰;clockskew屬性的值表示驗(yàn)證時(shí)間的時(shí)間偏移值。

上述代碼會(huì)從配置文件中讀取關(guān)于token的信息,因此還需在appsettings.json中添加如下內(nèi)容。

"security": {
"token": {
  "issuer": "demo_issuer",
  "audience": "demo_audience",
  "key": "<your_secret_key>"
}
}

為controller添加認(rèn)證

接下來,為了使用asp.net core的認(rèn)證功能來保護(hù)資源,應(yīng)為controller或action添加[authorize]特性,該特性能夠?qū)崿F(xiàn)在訪問相應(yīng)的controller或action時(shí),要求請(qǐng)求方提供指定的認(rèn)證方式,它位于microsoft.aspnetcore.authorization命名空間中。需要為authorcontroller和bookcontroller添加該特性。

[authorize]
public class authorcontroller : controllerbase
{
}
[authorize(authenticationschemes = jwtbearerdefaults.authenticationscheme)]
public class bookcontroller : controllerbase
{
}

如果使用了多個(gè)認(rèn)證方式,則可以使用[authorize]特性的authenticationschemes屬性指明當(dāng)前controller或action要使用哪一種認(rèn)證方式(如上例中的bookcontroller);如果不設(shè)置,則會(huì)使用所添加認(rèn)證時(shí)設(shè)置的默認(rèn)方案;如果沒有設(shè)置默認(rèn)方案,則會(huì)出現(xiàn)invalidoperationexception異常,并提示未指定默認(rèn)方案;此外,如果為authenticationschemes屬性指定了不存在的方案名稱,也會(huì)出現(xiàn)invalidoperationexception異常。

此時(shí)再訪問book和author資源,會(huì)出現(xiàn)401 unauthorized異常:

如果要允許某個(gè)action可以被匿名訪問,可以在action方法上添加屬性標(biāo)記 [allowanonymous]:

[allowanonymous]
public async task<actionresult<ienumerable<authordto>>> getauthorsasync([fromquery] authorresourceparameters parameters)

添加認(rèn)證信息生成接口

jwtbearer中間件提供了對(duì)jwt的驗(yàn)證功能,然而并未提供生成token的功能。要生成token,可以使用jwtsecuritytokenhandler類,它位于system.identitymodel.tokens.jwt命名空間,它不僅能夠生成jwt,由于它實(shí)現(xiàn)了isecuritytokenvalidator接口,因此對(duì)jwt的驗(yàn)證也是由它完成的。接下來,我們將創(chuàng)建一個(gè)controller,它將會(huì)根據(jù)用戶的認(rèn)證信息生成jwt,并返回給客戶端。

在controllers文件夾中創(chuàng)建一個(gè)controller,名為authenticatecontroller,內(nèi)容如下:

using system;
using system.collections.generic;
using system.identitymodel.tokens.jwt;
using system.security.claims;
using system.text;
using microsoft.aspnetcore.mvc;
using microsoft.extensions.configuration;
using microsoft.identitymodel.tokens;

namespace library.api.controllers
{
  [apicontroller, route("api/auth")]
  public class authenticatecontroller : controllerbase
  {
      public iconfiguration configuration { get; }
      public authenticatecontroller(iconfiguration configuration)
      {
          configuration = configuration;
      }

      [httppost("token", name = nameof(generatetoken))]
      public iactionresult generatetoken(string username, string password)
      {
          if (username != "demouser" || password != "demopassword")
          {
              return unauthorized();
          }

          var claims = new list<claim>{
              new claim(jwtregisteredclaimnames.sub, username)
          };

          var tokenconfigsection = configuration.getsection("security:token");
          var key = new symmetricsecuritykey(
              encoding.utf8.getbytes(tokenconfigsection["key"])
          );
          var signcredential = new signingcredentials(key, securityalgorithms.hmacsha256);
          var jwttoken = new jwtsecuritytoken(
              issuer: tokenconfigsection["issuer"],
              audience: tokenconfigsection["audience"],
              claims: claims,
              expires: datetime.now.addminutes(3),
              signingcredentials: signcredential
          );

          return ok(new {
              token = new jwtsecuritytokenhandler().writetoken(jwttoken),
              expiration = timezoneinfo.converttimefromutc(jwttoken.validto, timezoneinfo.local)
          });
      }
  }
}

在authenticatecontroller中的generatetoken方法中,通過創(chuàng)建jwtsecuritytoken對(duì)象,并使用jwtsecuritytokenhandler對(duì)象的writetoken方法最終得到生成的jwt。當(dāng)創(chuàng)建jwtsecuritytoken對(duì)象時(shí),我們可以指定issuer、audience以及當(dāng)前用戶的claim信息,此外,還可以指定該token的有效時(shí)間。這里需要注意,由于jwt不支持銷毀以及撤回功能,因此在設(shè)置它的有效時(shí)間時(shí),應(yīng)設(shè)置一個(gè)較短的時(shí)間(如上例中的3分鐘),這樣可以有效避免token在意外被竊取后所帶來的風(fēng)險(xiǎn)。

現(xiàn)在就可以請(qǐng)求認(rèn)證接口獲取 token:

這時(shí)重新請(qǐng)求資源接口,在請(qǐng)求頭中添加authorization項(xiàng),值為bearer ,就可以得到結(jié)果了:

這次示例中,使用了固定的用戶名和密碼,實(shí)際情況中,用戶名和密碼通常是存在數(shù)據(jù)庫中的,可以使用asp.net core identity來實(shí)現(xiàn)這一功能。

關(guān)于asp.net core mvc之實(shí)現(xiàn)基于token的認(rèn)證的文章就介紹至此,更多相關(guān)asp.net core token的認(rèn)證內(nèi)容請(qǐng)搜索碩編程以前的文章,希望大家多多支持碩編程

下一節(jié):如何在 .net 中使用 flurl 高效處理http請(qǐng)求

asp.net編程技術(shù)

相關(guān)文章