ASP.NET Core 2.0利用Jwt實現授權認證

來源:互聯網
上載者:User

標籤:amt   mod   設定檔   security   query   封裝   狀態   not   uri   

背景

在微服務架構下,一般都會按不同的業務或功能將整個系統切分成不同的獨立子系統,再通過REST API或RPC進行通訊並相互調用,形成各個子系統之間的串聯結構。在這裡,我們將採用REST API的通訊方式。比如:

1、有一個“使用者中心”獨立子系統名為“Lezhima.UserHub”,是一個基於ASP.NET Core mvc 2.0的項目。

2、有一個處理使用者訂單的獨立子系統名為“Lezhima.UserOrder”,是一個基於ASP.NET Core webp api 2.0的項目。

3、同時還有一個處理使用者檔案上傳的獨立子系統名為“Lezhima.UserUpload”,是一個基於ASP.NET Core webp api 2.0的項目。

業務關係如下:

使用者成功登入後進入“Lezhima.UserHub”,在使用者查看訂單時通過前端Ajax調用“Lezhima.UserOrder”的web api介面,在使用者上傳圖片是通過前端Ajax調用“Lezhima.UserUpload”的web api介面。

至此,我們瞭解了上面的業務關係後,心裡一定產生出如下兩個問題:

1、如何保障“Lezhima.UserOrder”與“Lezhima.UserUpload”兩個獨立系統內的web api介面安全,因為它們已經被暴露在了前端。

2、如何在“Lezhima.UserHub”站頒發Token。

那麼,帶著問題我們下面就結合ASP.NET Core 內建的Jwt技術來討論具體的實現(也許聰明的你有更好的解決方案,請一定告知我,謝謝)。

Jwt 全名為:JSON Web Token,是一個很成熟的技術,園子裡也有很多這方面的知識,我這裡就不再重述了。

 

 實現原理

“Lezhima.UserHub”站因為已經做了登入驗證,我們暫且認為它是可信的,所以在前端Ajax請求“Lezhima.UserOrder”站的web api介面時先到自已後端去產生一個Token,並隨之同本次跨站請求一塊攜帶至“Lezhima.UserOrder”站,“Lezhima.UserOrder”站驗證要求標頭中的Token是否合法,如合法則繼續路由到具體方法中,否則結束請求。“Lezhima.UserUpload”站原理與“Lezhima.UserOrder”相同。

 

實現代碼

Lezhima.UserHub頒發Token代碼:

        /// <summary>        /// 頒發一個指定有效期間的Token,並將當前登入的使用者id傳遞進來        /// </summary>        /// <param name="currentUserId"></param>        /// <param name="expiresMinutes"></param>        /// <returns></returns>  public static async Task<string> GetAccessToken(string currentUserId,int expiresMinutes=2)        {            return await Task.Run(() =>            {//約定私密金鑰,下面三個參數可放到設定檔中                var secret = "NGUzNmNlNzQtZThkZC00YjRh";//發行者                var iss = "Andre";//接受者                var aud = "Andre";                if (string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(iss) || string.IsNullOrEmpty(aud))                    return "";                if (string.IsNullOrEmpty(currentUserId))                    currentUserId = Guid.NewGuid().ToString();                var now = DateTime.UtcNow;                var claims = new Claim[]                {                    new Claim(JwtRegisteredClaimNames.Sub, currentUserId),                    new Claim(JwtRegisteredClaimNames.Iat, now.ToUniversalTime().ToString(), ClaimValueTypes.Integer64)                };                var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret));                var jwt = new JwtSecurityToken(                       issuer: iss,                       audience: aud,                       claims: claims,                       notBefore: now,                       expires: now.Add(TimeSpan.FromMinutes(expiresMinutes)),                       signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)                 );                return new JwtSecurityTokenHandler().WriteToken(jwt);            });                   }

Lezhima.UserHub前端Ajax跨站請求代碼:

//封裝一個Ajax請求公用方法function GetWebDataByObject(url, requestMethon, paramter) {    jQuery.support.cors = true;    apiUrl = ‘http://127.0.0.1:8012/‘;    var token = GetToken(); //調用本站內的Token頒發Web api介面     var result = [];    $.ajax({        type: requestMethon,        url: apiUrl + url,        data: paramter,        async: false,        beforeSend: function (xhr) {//將Token攜帶到要求標頭中            xhr.setRequestHeader("Authorization", "Bearer " + token);        },          success: function (data) {            result = data;        },        error: function (XMLHttpRequest, textStatus, errorThrown) {            // 狀態代碼            console.log(XMLHttpRequest.status);            // 狀態            console.log(XMLHttpRequest.readyState);            // 錯誤資訊               console.log(textStatus);        }    });    return result;}

“Lezhima.UserOrder”站開啟Jwt的Token驗證,在Startup.cs裡添加如下代碼:

        public IServiceProvider ConfigureServices(IServiceCollection services)        {                        services.AddCors();//從設定檔中擷取私密金鑰、發行者、接受者三個參數//三個參數的值必需與頒發Token站相同            var audienceConfig = Configuration.GetSection("Audience");            var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(audienceConfig["Secret"]));            var tokenValidationParameters = new TokenValidationParameters            {                ValidateIssuerSigningKey = true,                IssuerSigningKey = signingKey,                ValidateIssuer = true,                ValidIssuer = audienceConfig["Iss"],                ValidateAudience = true,                ValidAudience = audienceConfig["Aud"],                ValidateLifetime = true,                ClockSkew = TimeSpan.Zero,                RequireExpirationTime = true,            };//注入Jwt驗證            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)                .AddJwtBearer(options => {                    options.RequireHttpsMetadata = false;                    options.TokenValidationParameters = tokenValidationParameters;                });            services.AddMvc();            var builder = new ContainerBuilder();            builder.RegisterModule(new Evolution());            builder.Populate(services);            var container = builder.Build();            return container.Resolve<IServiceProvider>();        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            app.UseCors(builder =>              builder.WithOrigins("*")              .AllowAnyHeader()              .AllowAnyMethod()              .AllowCredentials()            );                     //開啟驗證            app.UseAuthentication();            app.UseMvc();        }

“Lezhima.UserOrder”站內的控制器裡添加驗證過濾器[Authorize],如下代碼:

    [Route("api/[Controller]")]    //添加過濾器後,該控制器內所有Action都將進行Token驗證    [Authorize]    public class OrderController : Controller    {            }

  

至此,基於ASP.NET Core的Jwt跨站驗證Token方案就全部完成了,是不是很簡單呀^_^  ^_^  

 

ASP.NET Core 2.0利用Jwt實現授權認證

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.