2014-02-19 46 views

回答

1

我這樣做是web配置

<elmah> 
    <security allowRemoteAccess="true" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" applicationName="Eers.Web"/> 
</elmah> 

進一步回落

<location path="elmah"> 
    <system.web> 
     <authorization>  
     <allow users="*"/> 
     </authorization> 
    </system.web> 
    </location> 
    <location path="elmah.axd" inheritInChildApplications="false"> 
    <system.web> 
     <httpHandlers> 
     <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
     </httpHandlers> 
    </system.web> 
    <system.webServer> 
     <handlers> 
     <add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" /> 
     </handlers> 
    </system.webServer> 
    </location> 

如果你注意一下它的工作原理就像在MVC任何其他安全節點。但它不適用於索賠。對於您將不得不寫一個Action過濾器

<authorization>  
    <allow users="*"/> 
    </authorization> 

這裏是我的Actionfilter

public class ElmahRequestAuthorizationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 

     if (filterContext.IsChildAction) return; 

     var controller = filterContext.RouteData.Values["controller"] as string; 

     if (controller != null && controller.ToLowerInvariant() != "elmah") return; 

     var authenticationComponent = GetAuthenticationInfo() // A method that will return us roles; 

     var goodRoles = new List<string> { 
      "TestRole", 
      "ThirdLevelSupport", 
      "Administrator" 
     }; 

     var roles = authenticationComponent.Roles ?? new List<string>(); 

     var thouShaltPass = roles.Intersect(goodRoles).Any(); 

     if (!thouShaltPass) 
     { 
      throw new HttpException(404, "Not Found"); 
     } 

    } 
} 
+0

如何註冊您ElmahRequestAuthorizationFilter?過濾器如何被調用?你不能把屬性放在控制器或動作上,因爲Elmah是一個模塊? – GavKilbride

+0

將其添加到App_Start中FilterConfig的其餘過濾器 – Peter

相關問題