日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

MVC全局用户验证之HttpModule

發布時間:2024/9/20 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVC全局用户验证之HttpModule 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在請求進入到MVC的處理mcvHandler之前,請求先到達HttpModule,因此可以利用HttpModule做全局的用戶驗證。

HttpModule

MVC5之前的版本基于system.web.dll庫,MvcApplication繼承自HttpApplication,以Http管道的方式運行,HttpApplication是整個ASP.NET基礎架構的核心,HttpApplication處理請求的整個生命周期是一個相對復雜的過程,在該過程的不同階段會觸發相應的事件

名稱

描述

BeginRequest

HTTP管道開始處理請求時,會觸發BeginRequest事件

AuthenticateRequest,PostAuthenticateRequest

ASP.NET先后觸發這兩個事件,使安全模塊對請求進行身份驗證

AuthorizeRequest,PostAuthorizeRequest

ASP.NET先后觸發這兩個事件,使安全模塊對請求進程授權

ResolveRequestCache,PostResolveRequestCache

ASP.NET先后觸發這兩個事件,以使緩存模塊利用緩存的直接對請求直接進程響應(緩存模塊可以將響應內容進程緩存,對于后續的請求,直接將緩存的內容返回,從而提高響應能力)。

PostMapRequestHandler

對于訪問不同的資源類型,ASP.NET具有不同的HttpHandler對其進程處理。對于每個請求,ASP.NET會通過擴展名選擇匹配相應的HttpHandler類型,成功匹配后,該實現被觸發

AcquireRequestState,PostAcquireRequestState

ASP.NET先后觸發這兩個事件,使狀態管理模塊獲取基于當前請求相應的狀態,比如SessionState

PreRequestHandlerExecute,PostRequestHandlerExecute

ASP.NET最終通過一請求資源類型相對應的HttpHandler實現對請求的處理,在實行HttpHandler前后,這兩個實現被先后觸發

ReleaseRequestState,PostReleaseRequestState

ASP.NET先后觸發這兩個事件,使狀態管理模塊釋放基于當前請求相應的狀態

UpdateRequestCache,PostUpdateRequestCache

ASP.NET先后觸發這兩個事件,以使緩存模塊將HttpHandler處理請求得到的相應保存到輸出緩存中

LogRequest,PostLogRequest

ASP.NET先后觸發這兩個事件為當前請求進程日志記錄

EndRequest

整個請求處理完成后,EndRequest事件被觸發

?HttpApplication提供了基于事件的擴展機制,允許程序員借助于處理管道中的事件進行處理過程擴展。在Asp.net中,提供了兩種方式來解決這個問題:IHttpModule方式和golbal.asax方式。這兩種方式的核心都是IHttpModule接口。

從功能上講,HttpModule之于ASP.NET,就好比ISAPI Filter之于IIS一樣。IIS將接收到的請求分發給相應的ISAPI Extension之前,注冊的ISAPI Filter會先截獲該請求。

當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還并沒有對這個HTTP請求做任何處理,也就是說此時對于HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的信息在這個HTTP請求信息之上,或者針對截獲的這個HTTP請求信息作一些額外的工作,或者在某些情況下干脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。

public class BasicAuthenticationHttpModule : IHttpModule{private static IAuthenticationService _authenticationService;public static void SetBasicAuthenticationValidator(IAuthenticationService authenticationService){_authenticationService = authenticationService;}public void Init(HttpApplication context){
//核心:用戶認證事件處理context.PostAuthenticateRequest += ContextOnAuthenticateRequest;}private static void ContextOnAuthenticateRequest(object sender, EventArgs eventArgs){if (_authenticationService == null ||HttpContext.Current == null ||HttpContext.Current.User == null ||HttpContext.Current.User.Identity.IsAuthenticated)return;try{IPrincipal principal = null;var headers = HttpContext.Current.Request.Headers;var authValue = headers[HttpRequestHeader.Authorization.ToString()];//if no Basic header, don't prompt for itif (authValue == null ||string.IsNullOrWhiteSpace(authValue) ||!authValue.StartsWith("Basic")){return;}//try to parse for itvar parsedCredentials = ParseAuthorizationHeader(authValue);if (parsedCredentials != null){principal = _authenticationService.ValidateCredentials(parsedCredentials.Item1, parsedCredentials.Item2);}if (principal == null){Unauthorized(HttpContext.Current);return;}SetPrincipal(principal);}catch (SecurityException){throw;}catch (Exception ex){throw new SecurityException("Unexpected error. See inner exception for details.", ex);}}private static void Unauthorized(HttpContext context){Trace.TraceWarning("Unauthorized basic credentials");context.Response.Headers.Add("WWW-Authenticate", "Basic");context.Response.StatusCode = 401;context.Response.StatusDescription = "Invalid credentials";context.ApplicationInstance.CompleteRequest();}private static Tuple<string, string> ParseAuthorizationHeader(string authHeader){try{string base64Credentials = authHeader.Substring(6);var credentials = Encoding.ASCII.GetString(Convert.FromBase64String(base64Credentials)).Split(new[] { ':' });if (credentials.Length != 2 ||string.IsNullOrEmpty(credentials[0]) ||string.IsNullOrEmpty(credentials[1])){return null;}return new Tuple<string, string>(credentials[0], credentials[1]);}catch (Exception exception){Trace.TraceError("BasicAuthentication: ParseHeader " + exception);throw;}}private static void SetPrincipal(IPrincipal principal){Thread.CurrentPrincipal = principal;HttpContext.Current.User = Thread.CurrentPrincipal;}public void Dispose(){}}

進行注冊

<system.webServer><modules><add name="BasicAuthenticationHttpModule" type="WebApplication1.BasicAuthenticationHttpModule" /></modules> </system.webServer>Global.asaxvoid Application_Start(object sender, EventArgs e) {BasicAuthenticationHttpModule.SetBasicAuthenticationValidator(new AuthenticationService()); }

總結

以上是生活随笔為你收集整理的MVC全局用户验证之HttpModule的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。