Asp.Net Core添加請求頭自定義認證的示例
前言
小項目中需要添加 Api 請求權(quán)限認證, 并且只是專用網(wǎng)絡(luò)內(nèi)使用,于是只想簡單得認證下是否可以訪問, 順便也是一種學(xué)習(xí)的過程,簡單記錄一下
要點
實現(xiàn) IAuthenticationHandler 接口:4 個方法
- 首先會調(diào)用 InitializeAsync 獲取到 scheme 和 context
- 然后調(diào)用 AuthenticateAsync ,在這里獲取 context 中的 Header 中需要傳過來的驗證信息,然后進行相關(guān)驗證,根據(jù)不同的結(jié)果會分別調(diào)用 ChallengeAsync 或者 ForbidAsync
public class HeaderAuth : IAuthenticationHandler {
public AuthenticationScheme Scheme { get; private set; }
public HttpContext CurrentContext { get; private set; }
public Task<AuthenticateResult> AuthenticateAsync() {
var token = CurrentContext.Request.Headers[GuidToken.GUID_TOKEN_KEY].ToString();
var (isValid, tokenEntity) = GuidToken.Valid(token);
if (!isValid || tokenEntity == null) {
return Task.FromResult(AuthenticateResult.Fail("未登錄或授權(quán)已過期。"));
}
// 生成 AuthenticationTicket
AuthenticationTicket ticket = new AuthenticationTicket(tokenEntity.ToClaimsPrincipal(), Scheme.Name);
return Task.FromResult(AuthenticateResult.Success(ticket));
}
public Task ChallengeAsync(AuthenticationProperties properties) {
CurrentContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
return Task.CompletedTask;
}
public Task ForbidAsync(AuthenticationProperties properties) {
CurrentContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
return Task.CompletedTask;
}
public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) {
Scheme = scheme;
CurrentContext = context;
return Task.CompletedTask;
}
}
GuidToken 類就是我們自定義的 token 管理器
public class GuidToken {
public const string GUID_TOKEN_NAME = "MtGuidTokenAuthentication";
public const string DEFAULT_AUTHENTICATION_TYPE = "local";
public const int TOKEN_LENGTH = 32;
public const string GUEST = "GUEST";
public const string DEFAULT_ROLE = "USER";
public const string DEFAULT_OPENID = "DEFAULT_OPENID";
public const string GUID_TOKEN_KEY = "Token";
private static int expireDuration = 0;
public string OpenId { get; set; }
public string Role { get; set; }
public DateTime Expire { get; set; }
private static readonly Dictionary<string, GuidToken> tokenCache = new Dictionary<string, GuidToken>();
public static (bool, GuidToken) Valid(string token) {
if (string.IsNullOrEmpty(token) || token.Length != TOKEN_LENGTH) {
return (false, null);
}
// 從 Session 中獲取令牌實體
GuidToken tokenEntity = GetTokenCache();
if (tokenEntity == null) {
return (false, null);
} else {
tokenEntity.Expire = DateTime.Now.AddMinutes(expireDuration);
}
return (true, tokenEntity);
GuidToken GetTokenCache() {
if (tokenCache.TryGetValue(token, out var val)) {
if (val.Expire > DateTime.Now) return val;
else tokenCache.Remove(token);
}
return null;
}
}
public static string Create(string openId = DEFAULT_OPENID, string role = DEFAULT_ROLE, int minutes = 30) {
var token = Guid.NewGuid().ToString("N");
expireDuration = minutes;
var entity = new GuidToken {
OpenId = openId,
Role = role,
Expire = DateTime.Now.AddMinutes(expireDuration)
};
tokenCache.Add(token, entity);
return token;
}
/// <summary>
/// 令牌實體 轉(zhuǎn) ClaimsPrincipal
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public ClaimsPrincipal ToClaimsPrincipal() {
var claimsIdentity = new ClaimsIdentity(new Claim[] {
new Claim(ClaimTypes.Name, OpenId),
new Claim(ClaimTypes.Role, Role),
}, GuidToken.DEFAULT_AUTHENTICATION_TYPE);
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
return claimsPrincipal;
}
}
最后就是使用方式
在 Startup 中配置
public void ConfigureServices(IServiceCollection services) {
// 注冊使用
services.AddAuthentication(options => {
options.AddScheme<HeaderAuth>(GuidToken.GUID_TOKEN_NAME, "Default Guid Token");
options.DefaultAuthenticateScheme = GuidToken.GUID_TOKEN_NAME;
options.DefaultChallengeScheme = GuidToken.GUID_TOKEN_NAME;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
app.UseCors("any");
app.UseStaticFiles();
// 開啟認證
app.UseAuthentication();
app.UseRouting();
// 開啟授權(quán)
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
在控制器中使用標簽
[Authorize]
public class JobController : ControllerBase {}
以上就是Asp.Net Core添加請求頭自定義認證的示例的詳細內(nèi)容,更多關(guān)于Asp.Net Core添加請求頭認證的資料請關(guān)注腳本之家其它相關(guān)文章!
- ASP.NET Core3.1 Ocelot認證的實現(xiàn)
- ASP.NET Core使用JWT認證授權(quán)的方法
- 深入解讀ASP.NET Core身份認證過程實現(xiàn)
- ASP.NET Core 實現(xiàn)基本認證的示例代碼
- ASP.NET Core學(xué)習(xí)之使用JWT認證授權(quán)詳解
- ASP.NET Core Authentication認證實現(xiàn)方法
- Asp.net Core中實現(xiàn)自定義身份認證的示例代碼
- 淺談ASP.NET Core 中jwt授權(quán)認證的流程原理
- ASP.Net Core3.0中使用JWT認證的實現(xiàn)
- Asp.Net Core基于JWT認證的數(shù)據(jù)接口網(wǎng)關(guān)實例代碼
- ASP.NET學(xué)習(xí)CORE中使用Cookie身份認證方法
相關(guān)文章
Asp.net+jquery+.ashx文件實現(xiàn)分頁思路
分頁思路: .ashx程序中,編寫好取得不同頁碼的程序。在頁面布局好的前提下,留下數(shù)據(jù)區(qū)域 div。然后在頁面請求 .ashx程序生成下一頁的html代碼。覆蓋div.innerHTMl2013-03-03
.NET+JS對用戶輸入內(nèi)容進行字數(shù)提示功能的實例代碼
.NET+JS對用戶輸入內(nèi)容進行字數(shù)提示功能的實例代碼,需要的朋友可以參考一下2013-06-06
asp.net core實現(xiàn)在線生成多個文件將多個文件打包為zip返回的操作
遇到安卓手機解壓縮文件損壞問題時,可以考慮兩種解決方案,方案一是使用SharpCompress庫,它是一個開源項目,能夠提供強大的壓縮與解壓功能,支持多種文件格式,方案二是采用aspose.zip庫,這兩種方法都能有效解決文件損壞的問題2024-11-11
.NET6創(chuàng)建Windows服務(wù)的實現(xiàn)步驟
本文主要介紹了.NET6創(chuàng)建Windows服務(wù)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
在.NET Core中用最原生的方式讀取Nacos的配置方法(推薦)
這篇文章主要介紹了在.NET Core中用最原生的方式讀取Nacos的配置方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

