如何在没有默认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" />当我想查看错误时,将它们从true切换到false并查看错误,然后再切换回来。但似乎当我更改这些值时,所有日志都会被擦除。
我能做什么?
发布于 2013-01-23 22:18:29
我认为最简单的方法是对您的自定义授权进行一些小的修改,这样ELMAH授权就可以工作了。
cookie选项1:在登录时设置FormsAuthentication 。这样,在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等)传递非常有用。如果感兴趣,我可以为此添加代码。
发布于 2015-02-26 11:13:30
我使用的是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身份框架将在登录时代表您建立该主体。
发布于 2013-01-23 23:30:33
在这种情况下,系统如何获取用户名或角色并不重要。无论是来自内置提供程序、您自己实现的提供程序,还是在自定义身份验证期间您自己填充此信息。所有需要做的就是在类似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")了。
https://stackoverflow.com/questions/14481506
复制相似问题