Asp.Net web api基於自定義Filter的安全認證
摘要
對第三方開放的介面,處於安全的考慮需要對其進行安全認證,是否是合法的請求。目前在專案中也遇到這種情況,提供的介面因為涉及到客戶銘感資料,所以在呼叫的時候,不能直接暴露,需要有一個認證的機制。所以對介面安全認證的方式,進行了調研,這裡提供一個自定義安全認證的Filter例子。
一個例子
在mvc中,如果需要對某個頁面如果使用者不登入則無法訪問,我們的做法可能是校驗session或者使用特性[Authorize]
[Authorize] public class UserController : Controller { // GET: User public ActionResult Index() { //if (Session["user"]==null) //{ // return RedirectToAction("login"); //} return View(); } }
在mvc中,這種認證方式基於windows或者form認證。但在提供web api給移動端app呼叫的時候,windows或者form認證就不太合適了。但我們可以自定義一種filter對當前訪問的使用者進行認證。
自定義Filter特性
////// 基於http basic認證 /// public class CustomerBasicAuthrizeAttribute : AuthorizationFilterAttribute { //重寫OnAuthorization 方法 public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { //如果action帶有允許匿名訪問的特性,則直接返回,不再進行安全認證 if (actionContext.ActionDescriptor.GetCustomAttributes().Any()) { return; } if (actionContext.Request.Headers.Authorization != null) { if (actionContext.Request.Headers.Authorization.Scheme != "Basic") { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpException("no token")); } else { string base64Para = actionContext.Request.Headers.Authorization.Parameter; //解碼base64字串 byte[] buffer = Convert.FromBase64String(base64Para); string decodeBase64 = Encoding.UTF8.GetString(buffer); if (!string.IsNullOrEmpty(decodeBase64)) { string[] paras = decodeBase64.Split(':'); if (paras.Length > 0) { string userName = paras[0]; string pwd = paras[1]; if (userName == "wolfy" && pwd == "123456") { } else { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpException("userName or pwd is error.")); } } else { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpException("no token")); } } else { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpException("no token")); } } } else { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpException("no Authorization header")); } base.OnAuthorization(actionContext); } }
使用postman測試
認證成功
第三方呼叫的時候,可以為其生成一對appname和appsecret放在供客戶端進行使用。客戶端使用的時候在請求頭的Authorization中新增base64字串就可以了。對於basic對應的值,是base64字串,如果感覺還不安全可以嘗試使用SSL方式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2318/viewspace-2800996/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ASP.NET Web API 2系列(四):基於JWT的token身份認證方案ASP.NETWebAPIJWT
- 基於 Laravel Auth 實現自定義介面 API 使用者認證詳解LaravelAPI
- ASP.NET Core 基於JWT的認證(一)ASP.NETJWT
- ASP.NET Core 基於JWT的認證(二)ASP.NETJWT
- 理解ASP.NET Core - 基於Cookie的身份認證(Authentication)ASP.NETCookie
- 理解ASP.NET Core - 基於JwtBearer的身份認證(Authentication)ASP.NETJWT
- Django(62)自定義認證類Django
- 跟我一起學Go系列:Go gRPC 安全認證方式-Token和自定義認證GoRPC
- 基於gin的golang web開發:認證利器jwtGolangWebJWT
- Asp.Net Core 3.1 學習4、Web Api 中基於JWT的token驗證及Swagger使用ASP.NETWebAPIJWTSwagger
- DRF內建認證元件之自定義認證系統元件
- Go gRPC進階-TLS認證+自定義方法認證(七)GoRPCTLS
- Jwtauth 自定義認證頭資訊JWT
- kafka SASL認證介紹及自定義SASL PLAIN認證功能KafkaAI
- 研究嵌入式裝置訪問Asp.Net Core Web Api的簡單認證方式ASP.NETWebAPI
- .Net Core中自定義認證實現
- 自定義Django認證系統的技術方案Django
- Larave Auth Token 認證使用自定義 Redis UserProviderRedisIDE
- 【認證與授權】2、基於session的認證方式Session
- Django(64)頻率認證原始碼分析與自定義頻率認證Django原始碼
- 【asp.net core】自定義模型繫結及其驗證ASP.NET模型
- ASP.NET Core - 實現自定義WebApi模型驗證ASP.NETWebAPI模型
- 微服務架構 | 7.1 基於 OAuth2 的安全認證微服務架構OAuth
- Kubernetes客戶端認證(二)—— 基於ServiceAccount的JWTToken認證客戶端JWT
- keycloak~在認證的action中自定義重定向地址
- 帶入gRPC:對 RPC 方法做自定義認證RPC
- .NET自定義認證雖然簡單,但好用
- 聊聊Dubbo(七):自定義Filter實踐Filter
- Kubernetes客戶端認證——基於CA證書的雙向認證方式客戶端
- python基於Json Web Token做服務端使用者認證PythonJSONWeb服務端
- keycloak~自定義認證流設定固定redirect_uri
- 基於Spring-AOP的自定義分片工具Spring
- 【ASP.NET Core】自定義的配置源ASP.NET
- Java安全之基於Tomcat的Filter型記憶體馬JavaTomcatFilter記憶體
- 讓ASP.NET Web API的Action方法ASP.NETWebAPI
- Laravel Web 認證LaravelWeb
- .net core自定義高效能的Web API服務閘道器WebAPI
- 關於shiro安全框架和shiro的認證流程框架