asp.net core3.1cookie和jwt混合認證授權實現(xiàn)多種身份驗證方案
開發(fā)了一個公司內部系統(tǒng),使用asp.net core 3.1。在開發(fā)用戶認證授權使用的是簡單的cookie認證方式,然后開發(fā)好了要寫幾個接口給其它系統(tǒng)調用數據。并且只是幾個簡單的接口不準備再重新部署一個站點,所以就直接在MVC的項目里面加了一個API區(qū)域用來寫接口。這時候因為是接口所以就不能用cookie方式進行認證,得加一個jwt認證,采用多種身份驗證方案來進行認證授權。
認證授權
身份驗證是確定用戶身份的過程。 授權是確定用戶是否有權訪問資源的過程。 在 ASP.NET Core 中,身份驗證由 IAuthenticationService 負責,而它供身份驗證中間件使用。 身份驗證服務會使用已注冊的身份驗證處理程序來完成與身份驗證相關的操作。
認證-->授權
關于認證授權我們要區(qū)分認證和授權是兩個概念,具體可查看MSDN官方文檔也可以搜索其它文章看看,講的很多。其中包括OAuth 2.0 以及jwt的相關知識都有很多資料并且講解的很好。
身份認證
身份驗證方案由 Startup.ConfigureServices 中的注冊身份驗證服務指定:
方式是在調用 services.AddAuthentication 后調用方案特定的擴展方法(例如 AddJwtBearer 或 AddCookie)。 這些擴展方法使用 AuthenticationBuilder.AddScheme 向適當的設置注冊方案。
添加cookie JwtBearer驗證方案
public void ConfigureServices(IServiceCollection services)
{
services.AddSession();
services.AddMvc(o =>
{
o.Filters.Add(typeof(MyExceptionFilterAttribute));// 全局異常Filter
}).AddRazorRuntimeCompilation();
//添加身份認證方案
var jwtConfig= Configuration.GetSection("Jwt").Get<JwtConfig>();
services.AddAuthentication
(authoption =>{
//指定默認選項
authoption.DefaultChallengeScheme= CookieAuthenticationDefaults.AuthenticationScheme;
authoption.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authoption.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authoption.DefaultSignInScheme= CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =>
{
option.Cookie.Name = "adCookie";//設置存儲用戶登錄信息(用戶Token信息)的Cookie名稱
option.Cookie.HttpOnly = true;//設置存儲用戶登錄信息(用戶Token信息)的Cookie,無法通過客戶端瀏覽器腳本(如JavaScript等)訪問到
option.ExpireTimeSpan = TimeSpan.FromDays(3);// 過期時間
option.SlidingExpiration = true;// 是否在過期時間過半的時候,自動延期
option.LoginPath = "/Account/Login";
option.LogoutPath = "/Account/LoginOut";
})
.AddJwtBearer(option =>
{
option.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = jwtConfig.Issuer,
ValidAudience = jwtConfig.Audience,
ValidateIssuer = true,
ValidateLifetime = jwtConfig.ValidateLifetime,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SigningKey)),
//緩沖過期時間,總的有效時間等于這個時間加上jwt的過期時間
ClockSkew = TimeSpan.FromSeconds(0)
};
});
}
JwtBearer認證的配置參數類JwtConfig
public class JwtConfig
{
/// <summary>
/// 誰頒發(fā)的
/// </summary>
public string Issuer { get; set; }
/// <summary>
/// 頒發(fā)給誰
/// </summary>
public string Audience { get; set; }
/// <summary>
/// 令牌密碼
/// a secret that needs to be at least 16 characters long
/// </summary>
public string SigningKey { get; set; }
/// <summary>
/// 過期時間(分鐘)
/// </summary>
public int Expires { get; set; }
/// <summary>
/// 是否校驗過期時間
/// </summary>
public bool ValidateLifetime { get; set; }
}
appsettings.json 配置參數
"Jwt": {
"Issuer": "issuer",
"Audience": "audience",
"SigningKey": "c0d32c63-z43d-4917-bbc2-5e726d087452",
//過期時間(分鐘)
"Expires": 10080,
//是否驗證過期時間
"ValidateLifetime": true
}
添加身份驗證中間件
通過在應用的 IApplicationBuilder 上調用 UseAuthentication 擴展方法,在 Startup.Configure 中添加身份驗證中間件。 如果調用 UseAuthentication,會注冊使用之前注冊的身份驗證方案的中間節(jié)。 請在依賴于要進行身份驗證的用戶的所有中間件之前調用 UseAuthentication。 如果使用終結點路由,則必須按以下順序調用 UseAuthentication:
- 在 UseRouting之后調用,以便路由信息可用于身份驗證決策。
- 在 UseEndpoints 之前調用,以便用戶在經過身份驗證后才能訪問終結點。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseSession();
app.UseRouting();
//開啟認證中間件
app.UseAuthentication();
//開啟授權中間件
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
cookie認證
[HttpPost]
public async Task<NewtonsoftJsonResult> LoginIn(string userName, string userPassword, string code)
{
AjaxResult objAjaxResult = new AjaxResult();
var user = _userBll.GetUser(userName, userPassword);
if (user == null)
{
objAjaxResult.Result = DoResult.NoAuthorization;
objAjaxResult.PromptMsg = "用戶名或密碼錯誤";
}
else
{
var claims = new List<Claim>
{
new Claim("userName", userName),
new Claim("userID",user.Id.ToString()),
};
await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme)));
objAjaxResult.Result = DoResult.Success;
objAjaxResult.PromptMsg = "登錄成功";
}
return new NewtonsoftJsonResult(objAjaxResult);
}
jwt認證
[HttpPost]
public NewtonsoftJsonResult Token([FromBody] UserInfo model)
{
AjaxResult objAjaxResult = new AjaxResult();
var user = _userBll.GetUser(model.UserName, model.Password);
if (user == null)
{
objAjaxResult.Result = DoResult.NoAuthorization;
objAjaxResult.PromptMsg = "用戶名或密碼錯誤";
}
else
{
//jwtTokenOptions 是通過配置獲取上面配置的參數信息
var jwtTokenOptions = BaseConfigModel.jwtConfig;
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtTokenOptions.SigningKey));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//身份
var claims = new List<Claim>
{
new Claim("userID",user.Id.ToString()),
new Claim("userName",user.UserName),
};
//令牌
var expires = DateTime.Now.AddMinutes(jwtTokenOptions.Expires);
var token = new JwtSecurityToken(
issuer: jwtTokenOptions.Issuer,
audience: jwtTokenOptions.Audience,
claims: claims,
notBefore: DateTime.Now,
expires: expires,
signingCredentials: credentials
);
string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
objAjaxResult.Result = DoResult.Success;
objAjaxResult.RetValue = new
{
token = jwtToken
};
objAjaxResult.PromptMsg = "登錄成功";
}
return new NewtonsoftJsonResult(objAjaxResult);
}
授權
在授權時,應用指示要使用的處理程序。 選擇應用程序將通過以逗號分隔的身份驗證方案列表傳遞到來授權的處理程序 [Authorize] 。 [Authorize]屬性指定要使用的身份驗證方案或方案,不管是否配置了默認。
默認授權
因為上面認證配置中我們使用cookie作為默認配置,所以前端對應的controller就不用指定驗證方案,直接打上[Authorize]即可。

選擇授權
對于API接口我們使用Jwt授權,在Controller上打上指定方案。
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

總結
關于多種方案混合驗證授權的流程:
1、配置認證方案(相關的配置參數可采用配置文件形式)。
2、添加授權驗證中間件。
3、提供認證接口。
4、配置需要授權的接口授權方案。
到此這篇關于asp.net core3.1cookie和jwt混合認證授權實現(xiàn)多種身份驗證方案的文章就介紹到這了,更多相關asp.net core cookie和jwt認證授權內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ASP.NET Core使用AutoMapper實現(xiàn)實體映射
本文詳細講解了ASP.NET Core使用AutoMapper實現(xiàn)實體映射的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
ASP.NET性能優(yōu)化小結(ASP.NET&C#)
ASP.NET性能優(yōu)化,提高頁面的執(zhí)行效率與下載速度,等很多需要考慮的細節(jié),編程人員值得參考下。2011-01-01
點擊圖片,AJAX刪除后臺圖片文件的實現(xiàn)代碼(asp.net)
點擊頁面上的圖片,用jQuery的AJAX來刪除后臺真實的文件。2010-11-11
關于Metalama使用Fabric操作項目或命名空間的問題
Metalama是一個基于微軟編譯器Roslyn的元編程的庫,可以解決我在開發(fā)中遇到的重復代碼的問題,這篇文章主要介紹了Metalama使用Fabric操作項目或命名空間,需要的朋友可以參考下2022-04-04
ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼
這篇文章主要介紹了ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼,需要的朋友可以參考下2017-10-10
ADO.NET實現(xiàn)對SQL Server數據庫的增刪改查示例
本篇文章主要介紹了ADO.NET實現(xiàn)對SQL Server數據庫的增刪改查示例,非常具有實用價值,需要的朋友可以參考下。2017-01-01

