【问题标题】:Configuring custom authorization with ELMAH使用 ELMAH 配置自定义授权
【发布时间】:2013-01-23 13:58:14
【问题描述】:

如果没有默认的 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 并查看错误,然后切换回来。但似乎当我更改这些值时,所有日志都被删除了。

我能做什么?

【问题讨论】:

  • 允许用户通过用户名访问不起作用?如果,在登录时,你设置了一个像FormsAuthentication.RedirectFromLoginPage 这样的身份验证cookie,它应该可以工作。在您的自定义授权中,您是否将人员设置为角色?
  • @MikeSmithDev 我什至没有使用角色或 Cookie。我只有一个管理页面,用户登录并创建会话。都是我做的,没有MS代码。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 elmah


【解决方案1】:

我认为最简单的方法是对您的自定义授权进行一些小改动,以便 ELMAH 授权生效。

选项 1: 在登录时设置 FormsAuthentication cookie。这样,在 web.config 中 allow users="username" 应该可以工作。成功登录后,您可以使用 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 等)传递等内容非常有用。如果有兴趣,我可以为此添加代码。

【讨论】:

  • 有效。它真的不关心用户名tho。但无论如何,至少现在只有当您登录到管理面板会话时才会创建,然后您才能查看/elmah。谢谢。
【解决方案2】:

我使用的是 ASP.NET Identity Framework,所以这个答案是关于那个设置的。我还在 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 身份框架将在您登录时代表您建立这些信息。

【讨论】:

  • 这对我有用,似乎是完美的超级简单解决方案。
【解决方案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")

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多