使用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")
。