如何将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
并查看错误,然后切换回来。但似乎当我更改这些值时,所有日志都会被删除。
我该怎么办?
答案 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")
。