Asp.Net Core添加請求頭自定義認證的示例
前言
小項目中需要添加 Api 請求權(quán)限認證, 并且只是專用網(wǎng)絡內(nèi)使用,于是只想簡單得認證下是否可以訪問, 順便也是一種學習的過程,簡單記錄一下
要點
實現(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學習之使用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學習CORE中使用Cookie身份認證方法
相關(guān)文章
asp.net中ADO SQL數(shù)據(jù)庫 筆記匯總 持續(xù)更新中
asp.net中ADO SQL數(shù)據(jù)庫 筆記匯總 持續(xù)更新中,需要的朋友可以參考下2012-07-07
基于localStorge開發(fā)登錄模塊的記住密碼與自動登錄實例
下面小編就為大家?guī)硪黄趌ocalStorge開發(fā)登錄模塊的記住密碼與自動登錄實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
在asp.net(c#)下實現(xiàn)調(diào)用cmd的方法
通常情況下我們會用到調(diào)用cmd.exe來實現(xiàn)一些命令,例如 ping ,等等2012-01-01
asp.net core 集成swagger ui的原理解析
本文主要講解了如何對API進行分組,這里僅僅是舉了一個按照API功能進行分組的例子,其實在實際開發(fā)中,要按照何種方式分組,可以按照需求靈活定義,比如按照API版本進行分組2021-10-10

