使用ELMAH配置自定义授权

时间:2013-01-23 13:58:14

标签: c# asp.net asp.net-mvc asp.net-mvc-4 elmah

如何将ELMAH配置为仅在没有默认ASP.NET授权角色管理器的情况下显示给某些人?

我(以及许多其他人,我认为)使用我自己的授权逻辑并从零开始构建我的项目,而不使用提供的模板。我想记录错误,但似乎无法配置ELMAH(以某种方式覆盖功能)使其与其他授权一起使用,甚至使其仅适用于特定的IP地址。

由于我可以访问web.config,因此我尝试更改这些值,以便默认情况下不显示elmah。

<add key="elmah.mvc.disableHandler" value="false" />
<add key="elmah.mvc.disableHandleErrorFilter" value="false" />
<add key="elmah.mvc.requiresAuthentication" value="false" />

当我想查看错误时,请将它们从true切换到false并查看错误,然后切换回来。但似乎当我更改这些值时,所有日志都会被删除。

我该怎么办?

3 个答案:

答案 0 :(得分:7)

我认为最简单的方法是对您的自定义授权进行一些小的更改,以便ELMAH授权可以使用。

选项1:在登录时设置FormsAuthentication Cookie。这样,在web.config中allow users="username"应该可以正常工作。成功登录后,您可以设置cookie FormsAuthentication.SetAuthCookie(theUsername, true)

ELMAH授权类似于:

<location path="elmah.axd" inheritInChildApplications="false">
    <system.web>
       <authorization>   
         <allow users="theUserName" />
         <deny users="*" />
       </authorization>
    </system.web>
  ...other config settings
</location>

选项2:如果您正在将用户置于角色中,则可以覆盖默认角色提供程序以使用您为获取角色所做的功能。这种方式稍微复杂一些,但随后可以让您在web.config中使用基于角色的身份验证,这对于保护静态文件(.pdf等)传递等内容非常有用。如果有兴趣,我可以为此添加代码。

答案 1 :(得分:5)

我使用的是ASP.NET身份框架,因此这个答案与该设置有关。我还在NuGet中使用了Elmah.MVC包。我在web.config中编辑了以下行。 (您需要在allowedUser设置中提供自己的用户名)

<add key="elmah.mvc.requiresAuthentication" value="true" />
<add key="elmah.mvc.allowedRoles" value="*" />
<add key="elmah.mvc.allowedUsers" value="your_user_name" />

ELMAH似乎从当前线程主体获取身份验证信息,ASP.NET身份框架将在您登录时代表您建立。

答案 2 :(得分:4)

在这种情况下,系统如何获取用户名或角色并不重要。无论是来自内置提供程序,还是您自己实现的提供程序,还是在自定义身份验证期间,您自己填充此信息。所需要的只是在Application_PostAuthenticationRequest事件之类的事件中手动设置主体。这应该给你它的主旨。

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    //Obtain username and roles from application datastore and use them in the next line
    Thread.CurrentPrincipal = new GenericPrincipal(
        new GenericIdentity("userNameHere"),
        new string[] { "Admin", "CanDeleteStuff", "CanEditStuff", "OtherRole" }
    );
}

这样您就可以在web.config

中使用此类内容
<location path="elmah.axd" inheritInChildApplications="false">
  <system.web>
    <authorization>
      <allow roles="Elmah"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

更不用说能够在代码中使用User.IsInRole("CanEditStuff")