1
+ using System ;
2
+ using System . Reflection ;
3
+ using System . Web ;
4
+ using System . Web . Compilation ;
5
+ using System . Web . Security ;
6
+ using System . Web . UI ;
7
+
8
+ [ AttributeUsage ( AttributeTargets . Method | AttributeTargets . Class ) ]
9
+ public class RequiresAuthenticationAttribute : Attribute { }
10
+
11
+ public class AttributeBasedFormsAuthenticationModule : IHttpModule {
12
+ public void Init ( HttpApplication application ) {
13
+ application . PostMapRequestHandler += OnPostAuthorizeRequest ;
14
+ }
15
+
16
+ public void Dispose ( ) {
17
+ // Clean up resources, if any
18
+ }
19
+
20
+ private void OnPostAuthorizeRequest ( object sender , EventArgs e ) {
21
+ var app = ( HttpApplication ) sender ;
22
+ var context = app . Context ;
23
+ var request = context . Request ;
24
+
25
+ if ( context . Handler is Page page ) {
26
+ if ( page ? . GetType ( ) . GetCustomAttribute < RequiresAuthenticationAttribute > ( ) != null ) {
27
+ if ( ! request . IsAuthenticated || request . Cookies [ FormsAuthentication . FormsCookieName ] == null ) {
28
+ DenyAccess ( context ) ;
29
+ }
30
+ }
31
+ if ( request . HttpMethod == "POST" ) {
32
+ var methodName = GetWebMethodNameFromRequest ( request ) ;
33
+ if ( ! string . IsNullOrEmpty ( methodName ) ) {
34
+ var pageType = page ? . GetType ( ) ;
35
+ var methodInfo = pageType ? . GetMethod ( methodName , BindingFlags . Public | BindingFlags . Static | BindingFlags . FlattenHierarchy ) ;
36
+ if ( methodInfo ? . GetCustomAttribute < RequiresAuthenticationAttribute > ( ) != null ) {
37
+ if ( ! request . IsAuthenticated || request . Cookies [ FormsAuthentication . FormsCookieName ] == null ) {
38
+ DenyAccess ( context ) ;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ private static void DenyAccess ( HttpContext context ) {
47
+ context . Response . StatusCode = 401 ;
48
+ context . Response . SuppressContent = true ;
49
+ context . Response . End ( ) ;
50
+ }
51
+
52
+ private static string GetWebMethodNameFromRequest ( HttpRequest request ) {
53
+ var pathInfo = request . PathInfo . TrimStart ( '/' ) ;
54
+ var slashIndex = pathInfo . IndexOf ( '/' ) ;
55
+ return slashIndex >= 0 ? pathInfo . Substring ( 0 , slashIndex ) : pathInfo ;
56
+ }
57
+ }
0 commit comments