MVC如何获取web.config的授权节点以使用ELMAH的ADFS声明

时间:2014-07-31 03:06:52

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

我有一个使用ADFS 2.0发布声明的现有MVC应用程序。

声明由数据库NOT活动目录组发出,因此不使用ClaimTypes.Role命名空间(我可能会编辑它以便它们这样做。)

在任何情况下,我都需要编写某种转换(可能在HttpModule中,因为我认为动作过滤器在请求过程中为时已太晚),如果它存在,则需要“my-namespace:Administrator”声明。把它变成一个可以在我的web配置的elmah部分测试的角色。我假设我需要的是声明使用ClaimsPrincipal的IsInRole方法

<location path="elmah">
<system.web>
  <authorization>
    <allow roles="Administrator"/>       
    <deny users="*"/>
  </authorization>
</system.web>

或者更容易设置路由约束来检查我当前从ADFS返回的声明

1 个答案:

答案 0 :(得分:0)

我最后编写了一个动作过滤器

public class ElmahRequestAuthorizationFilter : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {

        if (filterContext.IsChildAction) return;

        var controller = filterContext.RouteData.Values["controller"] as string;

        if (controller != null && controller.ToLowerInvariant() != "elmah") return;

        var authenticationComponent = GetAuthenticationInfo() // A method that will return us roles;

        var goodRoles = new List<string> {
            "TestRole",
            "ThirdLevelSupport",
            "Administrator"
        };

        var roles = authenticationComponent.Roles ?? new List<string>();

        var thouShaltPass = roles.Intersect(goodRoles).Any();

        if (!thouShaltPass)
        {
            throw new HttpException(404, "Not Found");
        }

    }
}