總結一下上一個項目中對webapi 用戶登錄許可權控制的設計 目的:前端可以根據介面的狀態碼來判斷用戶的登錄狀態,以及訪問許可權 1.首先我們在webconfig裡面添加一條配置,用於開啟或關閉許可權控制 2.先瞭解一下 ActionFilterAttribute 這個類,該類可以在action方法執行前 ...
總結一下上一個項目中對webapi 用戶登錄許可權控制的設計
目的:前端可以根據介面的狀態碼來判斷用戶的登錄狀態,以及訪問許可權
1.首先我們在webconfig裡面添加一條配置,用於開啟或關閉許可權控制
<appSettings> <add key="WebApiAuthFlag" value="true" />
</appSettings>
2.先瞭解一下 ActionFilterAttribute 這個類,該類可以在action方法執行前後進行攔截
// // 摘要: // 表示所有操作篩選器特性的基類。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IFilter { // // 摘要: // 初始化 System.Web.Http.Filters.ActionFilterAttribute 類的新實例。 protected ActionFilterAttribute(); // // 摘要: // 在調用操作方法之後發生。 // // 參數: // actionExecutedContext: // 操作執行的上下文。 public virtual void OnActionExecuted(HttpActionExecutedContext actionExecutedContext); public virtual Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken); // // 摘要: // 在調用操作方法之前發生。 // // 參數: // actionContext: // 操作上下文。 public virtual void OnActionExecuting(HttpActionContext actionContext); public virtual Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken); }
3.明白上面那個類的作用後,我們可以在Filter文件夾下新建一個類(不一定非得在Filter文件夾下,可以任意位置),並繼承於上面那個類,對OnActionExecuting方法進行重寫,此時該類就是一個過濾器。
使用方法:
1.全局過濾:在FilterConfig類里進行註冊。
2.局部過濾:在一個類或者方法上方添加該過濾器名稱的標簽即可實現過濾。
public class BasicAuthenticationAttribute : ActionFilterAttribute { /// <summary> /// 檢查用戶是否有該Action執行的操作許可權 /// </summary> /// <param name="actionContext"></param> public override void OnActionExecuting(HttpActionContext actionContext) { bool isRquired = false; try { //獲取剛纔在webconfig中的添加的許可權開關 isRquired = WebConfigurationManager.AppSettings["WebApiAuthFlag"].ToString().ToBool(); } catch (Exception ex) { //拋出異常 } //如果開啟... if (isRquired) { bool isLogin = false; //用戶登錄驗證 //代碼..... //代碼..... //代碼..... //isLogin = true or false; if (isLogin) { //如果已經登錄,則跳過驗證 base.OnActionExecuting(actionContext); } else { //如果請求Header不包含ticket,則判斷是否是匿名調用 var attr = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>(); bool isAnonymous = attr.Any(a => a is AllowAnonymousAttribute); //是匿名用戶,則繼續執行;非匿名用戶,拋出“未授權訪問”信息 ( 拋出401 ) if (isAnonymous) base.OnActionExecuting(actionContext); else actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); } } } }
上面都結束之後,我們可以開始寫我們自己的api類了。
4.首先新建一個api類,併在類的上方加上標簽,即我們剛上面建的那個過濾器的名稱
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web.Http; using Test.Filters;//引入過濾器所在空間 namespace Test.api { //添加過濾器標簽,對當前類里的所有方法進行過濾驗證 [BasicAuthenticationAttribute] public class MemberController : ApiController { //執行該方法前,會進行許可權驗證 public int GetMemberId() { return 0; } //如果給方法單獨添加AllowAnonymous標簽,則該方法會跳過驗證,直接執行 [AllowAnonymous] public string GetMemberName() { return "Bob"; } } }
5.好了,大功告成,我們看下效果
未登錄狀態下獲取 GetMemberId ,返回 401
已登錄狀態下獲取 GetMemberId , 返回 200
未登錄狀態下獲取 GetMemberName , 返回 200