使用ELMAH配置自定义授权

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

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

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

    

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

我能做什么?

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

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

ELMAH授权看起来像:

        ...other config settings  

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

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

    

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

在这种情况下,系统如何获取用户名或角色并不重要。 无论是来自内置提供程序,还是您自己实现的提供程序,还是在自定义身份validation期间,您自己填充此信息。 只需在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使用这样的东西

         

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