4

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

我(以及我认为的许多其他人)使用我自己的授权逻辑并从零开始构建我的项目,而不使用提供的模板。我想记录错误,但似乎不可能配置 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" />

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

我能做些什么?

4

3 回答 3

8

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

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

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 等)传递等内容非常有用。如果有兴趣,我可以为此添加代码。

于 2013-01-23T14:18:28.723 回答
6

我使用的是 ASP.NET Identity Framework,所以这个答案是关于那个设置的。我还在 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 身份框架将在登录时代表您建立这些信息。

于 2015-02-26T03:13:30.357 回答
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")在您的代码中使用了。

于 2013-01-23T15:30:33.243 回答