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

基于.Net?Core認(rèn)證授權(quán)方案之JwtBearer認(rèn)證

 更新時(shí)間:2022年06月15日 15:51:03   作者:springsnow  
這篇文章介紹了基于.Net?Core認(rèn)證授權(quán)方案之JwtBearer認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一.前言

回顧認(rèn)證方案之初步認(rèn)識(shí)JWT

在現(xiàn)代Web應(yīng)用程序中,即分為前端與后端兩大部分。當(dāng)前前后端的趨勢(shì)日益劇增,前端設(shè)備(手機(jī)、平板、電腦、及其他設(shè)備)層出不窮。因此,為了方便滿足前端設(shè)備與后端進(jìn)行通訊,就必須有一種統(tǒng)一的機(jī)制。所以導(dǎo)致API架構(gòu)的流行。而RESTful API這個(gè)API設(shè)計(jì)思想理論也就成為目前互聯(lián)網(wǎng)應(yīng)用程序比較歡迎的一套方式。

這種API架構(gòu)思想的引入,因此,我們就需要考慮用一種標(biāo)準(zhǔn)的,通用的,無(wú)狀態(tài)的,與語(yǔ)言無(wú)關(guān)的身份認(rèn)證方式來(lái)實(shí)現(xiàn)API接口的認(rèn)證。

HTTP提供了一套標(biāo)準(zhǔn)的身份驗(yàn)證框架:服務(wù)端可以用來(lái)針對(duì)客戶端的請(qǐng)求發(fā)送質(zhì)詢(challenge),客戶端根據(jù)質(zhì)詢提供應(yīng)答身份驗(yàn)證憑證。

質(zhì)詢與應(yīng)答的工作流程如下:服務(wù)端向客戶端返回401(Unauthorized,未授權(quán))狀態(tài)碼,并在WWW-Authenticate頭中添加如何進(jìn)行驗(yàn)證的信息,其中至少包含有一種質(zhì)詢方式。然后客戶端可以在請(qǐng)求中添加Authorization頭進(jìn)行驗(yàn)證,其Value為身份驗(yàn)證的憑證信息。

在本文中,將要介紹的是以Jwt Bearer方式進(jìn)行認(rèn)證。 

二.Bearer認(rèn)證

本文要介紹的Bearer驗(yàn)證也屬于HTTP協(xié)議標(biāo)準(zhǔn)驗(yàn)證,它隨著OAuth協(xié)議而開始流行,詳細(xì)定義見: RFC 6570。

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

A security token with the property that any party in possession of the token (a "bearer") can use the token in any way that any other party in possession of it can. Using a bearer token does not require a bearer to prove possession of cryptographic key material (proof-of-possession).

因此Bearer認(rèn)證的核心是Token,Bearer驗(yàn)證中的憑證稱為BEARER_TOKEN,或者是access_token,它的頒發(fā)和驗(yàn)證完全由我們自己的應(yīng)用程序來(lái)控制,而不依賴于系統(tǒng)和Web服務(wù)器,Bearer驗(yàn)證的標(biāo)準(zhǔn)請(qǐng)求方式如下:

Authorization: Bearer [BEARER_TOKEN] 

那么使用Bearer驗(yàn)證有什么好處呢?

  • CORS: cookies + CORS 并不能跨不同的域名。而Bearer驗(yàn)證在任何域名下都可以使用HTTP header頭部來(lái)傳輸用戶信息。
  • 對(duì)移動(dòng)端友好: 當(dāng)你在一個(gè)原生平臺(tái)(iOS, Android, WindowsPhone等)時(shí),使用Cookie驗(yàn)證并不是一個(gè)好主意,因?yàn)槟愕煤虲ookie容器打交道,而使用Bearer驗(yàn)證則簡(jiǎn)單的多。
  • CSRF: 因?yàn)锽earer驗(yàn)證不再依賴于cookies, 也就避免了跨站請(qǐng)求攻擊。
  • 標(biāo)準(zhǔn):在Cookie認(rèn)證中,用戶未登錄時(shí),返回一個(gè)302到登錄頁(yè)面,這在非瀏覽器情況下很難處理,而Bearer驗(yàn)證則返回的是標(biāo)準(zhǔn)的401 challenge。

三.JWT

上面介紹的Bearer認(rèn)證,其核心便是BEARER_TOKEN,那么,如何確保Token的安全是重中之重。一種是通過(guò)HTTPS的方式,另一種是通過(guò)對(duì)Token進(jìn)行加密編碼簽名,而最流行的Token編碼簽名方式便是:JSON WEB TOKEN。

Json web token (Jwt), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)(RFC 7519)。該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場(chǎng)景。JWT的聲明一般被用來(lái)在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。

JWT是由.分割的如下三部分組成:

Header.Payload.Signature

還記得之前說(shuō)個(gè)的一篇認(rèn)證方案之初步認(rèn)識(shí)JWT嗎?沒(méi)有的,可以看看,對(duì)JWT的特點(diǎn)和基本原理介紹,可以進(jìn)一步的了解。

學(xué)習(xí)了之前的文章后,我們可以發(fā)現(xiàn)使用JWT的好處在于通用性、緊湊性和可拓展性。

  • 通用性:因?yàn)閖son的通用性,所以JWT是可以進(jìn)行跨語(yǔ)言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語(yǔ)言都可以使用。
  • 緊湊性:JWT的構(gòu)成非常簡(jiǎn)單,字節(jié)占用很小,通過(guò) GET、POST 等放在 HTTP 的 header 中,便于傳輸。
  • 可擴(kuò)展性:JWT是自我包涵的,因?yàn)橛辛藀ayload部分,包含了必要的一些其他業(yè)務(wù)邏輯所必要的非敏感信息,自身存儲(chǔ),不需要在服務(wù)端保存會(huì)話信息, 非常易于應(yīng)用的擴(kuò)展。

四.開始

1. 注冊(cè)認(rèn)證服務(wù)

在這里,我們用微軟給我們提供的JwtBearer認(rèn)證方式,實(shí)現(xiàn)認(rèn)證服務(wù)注冊(cè) 。

引入nuget包:Microsoft.AspNetCore.Authentication.JwtBearer

注冊(cè)服務(wù),將服務(wù)添加到容器中,

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        var Issurer = "JWTBearer.Auth";  //發(fā)行人
        var Audience = "api.auth";       //受眾人
        var secretCredentials = "q2xiARx$4x3TKqBJ";   //密鑰

        //配置認(rèn)證服務(wù)
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(o=>{
            o.TokenValidationParameters = new TokenValidationParameters
            {
                //是否驗(yàn)證發(fā)行人
                ValidateIssuer = true,
                ValidIssuer = Issurer,//發(fā)行人
                //是否驗(yàn)證受眾人
                ValidateAudience = true,
                ValidAudience = Audience,//受眾人
                //是否驗(yàn)證密鑰
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretCredentials)),
                
                ValidateLifetime = true, //驗(yàn)證生命周期
                RequireExpirationTime = true, //過(guò)期時(shí)間
            };
        });
    }

注意說(shuō)明:

一. TokenValidationParameters的參數(shù)默認(rèn)值:
1. ValidateAudience = true,  ----- 如果設(shè)置為false,則不驗(yàn)證Audience受眾人
2. ValidateIssuer = true ,   ----- 如果設(shè)置為false,則不驗(yàn)證Issuer發(fā)布人,但建議不建議這樣設(shè)置
3. ValidateIssuerSigningKey = false,
4. ValidateLifetime = true,  ----- 是否驗(yàn)證Token有效期,使用當(dāng)前時(shí)間與Token的Claims中的NotBefore和Expires對(duì)比
5. RequireExpirationTime = true, ----- 是否要求Token的Claims中必須包含Expires
6. ClockSkew = TimeSpan.FromSeconds(300), ----- 允許服務(wù)器時(shí)間偏移量300秒,即我們配置的過(guò)期時(shí)間加上這個(gè)允許偏移的時(shí)間值,才是真正過(guò)期的時(shí)間(過(guò)期時(shí)間 +偏移值)你也可以設(shè)置為0,ClockSkew = TimeSpan.Zero

調(diào)用方法,配置Http請(qǐng)求管道:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        //1.先開啟認(rèn)證
        app.UseAuthentication();
        //2.再開啟授權(quán)
        app.UseAuthorization();

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

JwtBearerOptions的配置中,通常IssuerSigningKey(簽名秘鑰)ValidIssuer(Token頒發(fā)機(jī)構(gòu))ValidAudience(頒發(fā)給誰(shuí)) 三個(gè)參數(shù)是必須的,后兩者用于與TokenClaims中的IssuerAudience進(jìn)行對(duì)比,不一致則驗(yàn)證失敗。

2.接口資源保護(hù)

創(chuàng)建一個(gè)需要授權(quán)保護(hù)的資源控制器,這里我們用建立API生成項(xiàng)目自帶的控制器,WeatherForecastController.cs, 在控制器上使用Authorize即可

[ApiController]
[Route("[controller]")]
[Authorize]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

3. 生成Token

因?yàn)槲④洖槲覀儍?nèi)置了JwtBearer驗(yàn)證,但是沒(méi)有提供Token的發(fā)放,所以這里我們要實(shí)現(xiàn)生成Token的方法

引入Nugets包:System.IdentityModel.Tokens.Jwt

這里我們根據(jù)IdentityModel.Tokens.Jwt文檔給我們提供的幫助類,提供了方法WriteToken創(chuàng)建Token,根據(jù)參數(shù)SecurityToken,可以實(shí)例化,JwtSecurityToken,指定可選參數(shù)的類。

新增AuthController.cs控制器:

    [HttpGet]
    public IActionResult GetToken()
    {
        try
        {
            //定義發(fā)行人issuer
            string iss = "JWTBearer.Auth";
            //定義受眾人audience
            string aud = "api.auth";

            //定義許多種的聲明Claim,信息存儲(chǔ)部分,Claims的實(shí)體一般包含用戶和一些元數(shù)據(jù)
            IEnumerable<Claim> claims = new Claim[]
            {
                new Claim(JwtClaimTypes.Id,"1"),
                new Claim(JwtClaimTypes.Name,"i3yuan"),
            };
            //notBefore  生效時(shí)間
            // long nbf =new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds();
            var nbf = DateTime.UtcNow;
            //expires   //過(guò)期時(shí)間
            // long Exp = new DateTimeOffset(DateTime.Now.AddSeconds(1000)).ToUnixTimeSeconds();
            var Exp = DateTime.UtcNow.AddSeconds(1000);
            //signingCredentials  簽名憑證
            string sign = "q2xiARx$4x3TKqBJ"; //SecurityKey 的長(zhǎng)度必須 大于等于 16個(gè)字符
            var secret = Encoding.UTF8.GetBytes(sign);
            var key = new SymmetricSecurityKey(secret);
            var signcreds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var jwt = new JwtSecurityToken(issuer: iss, audience: aud, claims:claims,notBefore:nbf,expires:Exp, signingCredentials: signcreds);
	    var JwtHander = new JwtSecurityTokenHandler();
            var token = JwtHander.WriteToken(jwt);
            return Ok(new
            {
                access_token = token,
                token_type = "Bearer",
            });
        }
        catch (Exception ex)
        {
            throw;
        }
    }
注意:
SecurityKey 的長(zhǎng)度必須 大于等于 16個(gè)字符,否則生成會(huì)報(bào)錯(cuò)。(可通過(guò)在線隨機(jī)生成密鑰)

五. 運(yùn)行

訪問(wèn)獲取Token方法,獲取得到access_token:

再訪問(wèn),授權(quán)資源接口,可以發(fā)現(xiàn),再?zèng)]有添加請(qǐng)求頭token值的情況下,返回了401沒(méi)有權(quán)限。

這次,在請(qǐng)求頭通過(guò)Authorization加上之前獲取的token值后,再次進(jìn)行訪問(wèn),發(fā)現(xiàn)已經(jīng)可以獲取訪問(wèn)資源控制器,并返回對(duì)應(yīng)的數(shù)據(jù)。

六.擴(kuò)展說(shuō)明

在HTTP標(biāo)準(zhǔn)驗(yàn)證方案中,我們比較熟悉的是"Basic"和"Digest",前者將用戶名密碼使用BASE64編碼后作為驗(yàn)證憑證,后者是Basic的升級(jí)版,更加安全,因?yàn)锽asic是明文傳輸密碼信息,而Digest是加密后傳輸。

1、Basic基礎(chǔ)認(rèn)證

Basic認(rèn)證是一種較為簡(jiǎn)單的HTTP認(rèn)證方式,客戶端通過(guò)明文(Base64編碼格式)傳輸用戶名和密碼到服務(wù)端進(jìn)行認(rèn)證,通常需要配合HTTPS來(lái)保證信息傳輸?shù)陌踩?/p>

客戶端請(qǐng)求需要帶Authorization請(qǐng)求頭,值為“Basic xxx”,xxx為“用戶名:密碼”進(jìn)行Base64編碼后生成的值。 若客戶端是瀏覽器,則瀏覽器會(huì)提供一個(gè)輸入用戶名和密碼的對(duì)話框,用戶輸入用戶名和密碼后,瀏覽器會(huì)保存用戶名和密碼,用于構(gòu)造Authorization值。當(dāng)關(guān)閉瀏覽器后,用戶名和密碼將不再保存。

憑證為“YWxhzGRpbjpvcGVuc2VzYWl1”,是通過(guò)將“用戶名:密碼”格式的字符串經(jīng)過(guò)的Base64編碼得到的。而Base64不屬于加密范疇,可以被逆向解碼,等同于明文,因此Basic傳輸認(rèn)證信息是不安全的。

Basic基礎(chǔ)認(rèn)證圖示:

缺陷匯總

  • 1.用戶名和密碼明文(Base64)傳輸,需要配合HTTPS來(lái)保證信息傳輸?shù)陌踩?/li>
  • 2.即使密碼被強(qiáng)加密,第三方仍可通過(guò)加密后的用戶名和密碼進(jìn)行重放攻擊。
  • 3.沒(méi)有提供任何針對(duì)代理和中間節(jié)點(diǎn)的防護(hù)措施。
  • 4.假冒服務(wù)器很容易騙過(guò)認(rèn)證,誘導(dǎo)用戶輸入用戶名和密碼。

2、Digest摘要認(rèn)證

Digest認(rèn)證是為了修復(fù)基本認(rèn)證協(xié)議的嚴(yán)重缺陷而設(shè)計(jì)的,秉承“絕不通過(guò)明文在網(wǎng)絡(luò)發(fā)送密碼”的原則,通過(guò)“密碼摘要”進(jìn)行認(rèn)證,大大提高了安全性。

Digest認(rèn)證步驟如下:

第一步:客戶端訪問(wèn)Http資源服務(wù)器。由于需要Digest認(rèn)證,服務(wù)器返回了兩個(gè)重要字段nonce(隨機(jī)數(shù))和realm。

第二步:客戶端構(gòu)造Authorization請(qǐng)求頭,值包含username、realm、nouce、uri和response的字段信息。其中,realm和nouce就是第一步返回的值。nouce只能被服務(wù)端使用一次。uri(digest-uri)即Request-URI的值,但考慮到經(jīng)代理轉(zhuǎn)發(fā)后Request-URI的值可能被修改、因此實(shí)現(xiàn)會(huì)復(fù)制一份副本保存在uri內(nèi)。response也可叫做Request-digest,存放經(jīng)過(guò)MD5運(yùn)算后的密碼字符串,形成響應(yīng)碼。

第三步:服務(wù)器驗(yàn)證包含Authorization值的請(qǐng)求,若驗(yàn)證通過(guò)則可訪問(wèn)資源。
Digest認(rèn)證可以防止密碼泄露和請(qǐng)求重放,但沒(méi)辦法防假冒。所以安全級(jí)別較低。
Digest和Basic認(rèn)證一樣,每次都會(huì)發(fā)送Authorization請(qǐng)求頭,也就相當(dāng)于重新構(gòu)造此值。所以兩者易用性都較差。

Digest認(rèn)證圖示:

七.注意

  • 在進(jìn)行JwtBearer認(rèn)證時(shí),在生成token之后,還需要與刷新token配合使用,因?yàn)楫?dāng)用戶執(zhí)行了退出,修改密碼等操作時(shí),需要讓該token無(wú)效,無(wú)法再次使用,所以,會(huì)給access_token設(shè)置一個(gè)較短的有效期間,(JwtBearer認(rèn)證默認(rèn)會(huì)驗(yàn)證有效期,通過(guò)notBeforeexpires來(lái)驗(yàn)證),當(dāng)access_token過(guò)期后,可以在用戶無(wú)感知的情況下,使用refresh_token重新獲取access_token,但這就不屬于Bearer認(rèn)證的范疇了,但是我們可以通過(guò)另一種方式通過(guò)IdentityServer的方式來(lái)實(shí)現(xiàn),在后續(xù)中會(huì)對(duì)IdentityServer進(jìn)行詳細(xì)講解。
  • 在生成token的時(shí)候,需要用的secret,主要是用來(lái)防止token被偽造與篡改。因?yàn)楫?dāng)token被劫取的時(shí)候,可以得到你的令牌中帶的一些個(gè)人不重要的信息明文,但不用擔(dān)心,只要你不在生成token里把私密的個(gè)人信息放出去的話,就算被動(dòng)機(jī)不良的人得到,也做不了什么事情。但是你可能會(huì)想,如果用戶自己隨便的生成一個(gè) token ,帶上你的信息,那不就可以隨便訪問(wèn)你的資源服務(wù)器了,因此這個(gè)時(shí)候就需要利用secret 來(lái)生成 token,來(lái)確保數(shù)字簽名的正確性。而且在認(rèn)證授權(quán)資源,進(jìn)行token解析的時(shí)候,通過(guò)微軟的源碼發(fā)現(xiàn),已經(jīng)幫我們封裝了方法,對(duì)secret進(jìn)行了校驗(yàn)了,確保了token的安全性,從而保證api資源的安全。

八.總結(jié)

  • JwtToken在認(rèn)證時(shí),無(wú)需Security token service安全令牌服務(wù)器的參與,都是基于Claim的,默認(rèn)會(huì)驗(yàn)證有效期,通過(guò)notBeforeexpires來(lái)驗(yàn)證,這在分布式中提供給了極大便利。
  • JwtToken與平臺(tái)、無(wú)言無(wú)關(guān),在前端也可以直接解析出Claims。

本示例源碼地址 
參考JwtBearer源碼

到此這篇關(guān)于基于.Net Core認(rèn)證授權(quán)方案之JwtBearer認(rèn)證的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET刷新頁(yè)面的幾種方法詳解

    ASP.NET刷新頁(yè)面的幾種方法詳解

    這篇文章介紹了ASP.NET刷新頁(yè)面的幾種方法,有需要的朋友可以參考一下
    2013-11-11
  • 詳解ASP.NET Core 中的多語(yǔ)言支持(Localization)

    詳解ASP.NET Core 中的多語(yǔ)言支持(Localization)

    本篇文章主要介紹了ASP.NET Core 中的多語(yǔ)言支持(Localization) ,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • asp.net中url地址傳送中文參數(shù)時(shí)的兩種解決方案

    asp.net中url地址傳送中文參數(shù)時(shí)的兩種解決方案

    前天遇到一個(gè)地址傳遞中文參數(shù)變?yōu)閬y碼的問(wèn)題,同樣的兩個(gè)web Project,一個(gè)是vs2003,一個(gè)是vs2005,前者可以,后者就是不可以。
    2009-11-11
  • 記錄游客頁(yè)面訪問(wèn)IP的簡(jiǎn)易實(shí)現(xiàn)代碼 (asp.net+txt)

    記錄游客頁(yè)面訪問(wèn)IP的簡(jiǎn)易實(shí)現(xiàn)代碼 (asp.net+txt)

    記錄游客頁(yè)面訪問(wèn)IP的簡(jiǎn)易實(shí)現(xiàn) (asp.net for notepad)
    2010-01-01
  • .NET中的DES對(duì)稱加密詳解

    .NET中的DES對(duì)稱加密詳解

    DES是一種對(duì)稱加密(Data Encryption Standard)算法,于1977年得到美國(guó)政府的正式許可,是一種用56位密鑰來(lái)加密64位數(shù)據(jù)的方法。一般密碼長(zhǎng)度為8個(gè)字節(jié),其中56位加密密鑰,每個(gè)第8位都用作奇偶校驗(yàn)
    2013-10-10
  • ASP.NET MVC中分部視圖的應(yīng)用方法

    ASP.NET MVC中分部視圖的應(yīng)用方法

    這篇文章主要給大家介紹了關(guān)于ASP.NET MVC中分部視圖的應(yīng)用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的完整實(shí)例

    ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 詳解ASP.NET Core Web Api之JWT刷新Token

    詳解ASP.NET Core Web Api之JWT刷新Token

    這篇文章主要介紹了詳解ASP.NET Core Web Api之JWT刷新Token,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • ASP.NET MVC 導(dǎo)出Word報(bào)表

    ASP.NET MVC 導(dǎo)出Word報(bào)表

    本文主要介紹了ASP.NET MVC 導(dǎo)出Word報(bào)表的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • C# 文件上傳 默認(rèn)最大為4M的解決方法

    C# 文件上傳 默認(rèn)最大為4M的解決方法

    .net中默只能上傳小于4m的文件,大于4M將無(wú)法顯示頁(yè)面.那么如何設(shè)置來(lái)使imputfile能上傳更大的文件呢
    2008-11-11

最新評(píng)論