2013-01-23 102 views
4

如何配置ELMAH以仅显示某些没有默认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" /> 

而当我想查看错误切换他们truefalse,看看错误,然后切换回来。但是,似乎当我更改这些值时,所有日志都将被删除。

我该怎么办?

+0

允许用户通过用户名访问不起作用?如果在登录时,您使用类似'FormsAuthentication.RedirectFromLoginPage'的方式设置身份验证Cookie,它应该可以工作。在您的自定义授权中,您是否将角色设置为人员? – MikeSmithDev

+0

@MikeSmithDev我甚至没有使用角色或饼干。我刚刚有一个管理页面,用户登录并创建会话。这一切都由我完成,没有MS代码。 – sed

回答

7

我认为最简单的方法是对您的自定义授权进行一些较小的更改,以便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等)的传输。如果感兴趣,我可以添加代码。

+0

作品。它真的不关心用户名tho。但无论如何,至少现在只有当您登录到管理面板会话时才会创建,只有这样才能查看'/ elmah'。谢谢。 – sed

3

在这种情况下,系统如何获取用户名或角色并不重要。无论是来自内置提供商还是您自己实施的提供商,或者如果您在自定义身份验证期间自行填写此信息。所需要的就是在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")

4

我正在使用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身份框架将在登录时建立以您的名义。