在上一篇.net core下對於附件上傳下載的實現主要介紹了 .net core下文件上傳下載的相關操作,本篇主要介紹下對於權限驗證如何通過自定義的中間件進行攔截實現。
對於一般的程序而言,如果在未登錄的情況下理應是沒有對應的權限訪問對應的頁面的,同時,不同的用戶也需要驗證該用戶權限是否滿足條件。
對於後端服務來說,就需要有個中間層進行攔截,驗證對應的http請求是否滿足權限要求。
這裏我們用到了Middleware-請求管道,通過自定義中間件的方式來實現對Http請求的攔截,實現相關驗證。
對於Middleware-請求管道的原理和解釋可以參考這篇文章:Middleware-請求管道的構成
實現邏輯
用戶在登錄成功後,我們在服務端會自動生成一個Token
,這個Token
會綁定對應的權限,同時保存到Redis中。
我們自定義的中間層會攔截請求,獲取請求中的Token
是否合法,若不合法會對該請求進行攔截。
通過使用UseMiddleware
擴展方法,將攔截到的HttpContext
進行相應的邏輯處理。
具體代碼
首先我們自定義一個權限控制的中間件,SecurityMiddleware
類就是我們具體的邏輯實現。
public static IApplicationBuilder UseSecurity(this IApplicationBuilder builder)
{
return builder.UseMiddleware<SecurityMiddleware>();
}
在Startup.cs
中的Configure
方法下,我們添加我們自定義的中間件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger();
app.UseSwaggerUI(c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json", "我的API V1");
});
app.UseSecurity();//自定義中間件
app.UseMvc();
}
接下來我們具體實現對應的SecurityMiddleware
類,主要實現對應的Invoke
方法
public async Task Invoke(HttpContext context)
{
string path = context.Request.Path.ToString().ToLower();
// 判斷請求的路徑是否是排除權限限制的(如登錄頁,登錄頁)
if (excludeUrl.Contains(path))
{
await _next(context);
return;
}
// 尋找header中的token
string userToken = string.Empty;
bool hasValue = context.Request.Headers.TryGetValue(INVOKER_TOKEN_HEADER, out StringValues token);
if (!hasValue || token.Count == 0)
{
// 若header沒取到token,則嘗試從cookie中獲取
userToken = context.Request.Cookies[USER_TOKEN_COOKIE_NAME];
if(string.IsNullOrWhiteSpace(userToken))
{
// TODO: 尚未登錄,未經授權
await CreateUnauthorizedResponse(context);
return;
}
}
else
{
userToken = token[0];
}
//根據對應的Token到Redis中找對應的權限數據,若沒找到,說明沒有授權
var userInfo = await GetUserInfo(userToken);
if (userInfo == null)
{
// TODO: 尚未登錄,未經授權
await CreateUnauthorizedResponse(context);
return;
}
//可繼續針對請求判斷是否有相對應的權限
}
對應構造Response方法:
private static async Task CreateUnauthorizedResponse(HttpContext context)
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Response.ContentType = "application/json;charset=utf-8";
ResponseResult result = new ResponseResult
{
Result = false,
ErrorMessage = "您需要登錄後訪問此資源,請先進行登錄操作。",
Code = ResponseCode.Unauthorized
};
await context.Response.WriteAsync(JsonConvert.SerializeObject(result), Encoding.UTF8);
}
到這裏,我們基本上實現的對應的控制訪問。
總結
對於本篇來說,還是需要去了解下 .net core的運行原理,以便更好的去實現你想要的方法。