使用Thinktecture.IdentityModel进行声明授权

时间:2014-05-16 16:11:34

标签: c# asp.net-mvc security claims-based-identity

正如leastprivilege所述,有两种方法可以使用Thinktecture.IdentityModel设置声明授权检查。一个是设置过滤器。另一种是为要检查的操作添加属性。

我成功使用了属性选项。但是,我想覆盖向登录页面发送未经授权(但经过身份验证)的请求的行为。

相反,我想简单地提出401错误(或未经授权的页面)。到目前为止,我有以下类来覆盖HandleUnauthorizedRequest并抛出401错误(如果已验证)。但是,我发现如何连接它的唯一方法是将此类添加为过滤器。通过这样做,它跳过使用属性装饰,只将动作/资源发送到CheckAcess方法,这对我们没用。

    public class CustomClaimsAuthorizeAttribute : Thinktecture.IdentityModel.Authorization.Mvc.ClaimsAuthorizeAttribute
{
    public CustomClaimsAuthorizeAttribute()
    {
    }

    public CustomClaimsAuthorizeAttribute(string action, params string[] resources)
        : base(action, resources)
    {
    }


    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            throw new UnauthorizedAccessException("Insufficent permissions.");

        base.HandleUnauthorizedRequest(filterContext);
    }
}

1 个答案:

答案 0 :(得分:2)

对于任何可能感兴趣的人。我终于意识到这与使用我自己的类名作为属性一样简单(荒谬)。

CustomClaimsAuthorizeAttribute("myParameter")
public ActionResult Index()
{
  ...
}

此外,我发现即使我的web.config文件中包含以下内容,抛出UnauthorizedAccessException也不会向用户显示指定的401错误页面。相反,他们会收到一般错误页面。

<customErrors mode="On" defaultRedirect="ErrorPage.aspx">
   <error statusCode="401" redirect="ErrorNoAccess.aspx" />
</customErrors>

此例外产生:

  

“ASP.NET无权访问所请求的资源。请考虑   授予对ASP.NET请求的资源访问权限   身份。 ASP.NET具有基本进程标识(通常是   IIS 5上的{MACHINE} \ ASPNET或IIS 6和IIS 7上的网络服务,以及   IIS 7.5上配置的应用程序池标识,如果使用的话   该申请不是冒充。如果申请是   冒充通过,身份将是   匿名用户(通常是IUSR_MACHINENAME)或经过身份验证的用户   请求用户。“

我改为决定抛出403(Forbidden)错误。所以我的覆盖最终看起来像这样:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{

    if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        throw new HttpException((int)HttpStatusCode.Forbidden, "Unauthorized access");

    base.HandleUnauthorizedRequest(filterContext);
}

我的web.config错误页面指定为:

<customErrors mode="On" defaultRedirect="ErrorPage.aspx">
  <error statusCode="403" redirect="ErrorNoAccess.aspx" />
  <error statusCode="404" redirect="ErrorNotFound.aspx" />
  <error statusCode="500" redirect="ErrorPage.aspx" />
</customErrors>

我现在可以以权限不足的用户身份登录,并显示ErrorNoAccess.aspx页面,而不是被抛到登录页面(如果我“记住我”,它实际上变成了循环)。

由于经过有效身份验证但未经授权的请求,我真的不明白MS将用户扔到登录页面的想法。用户没有反馈为什么他们会被扔回登录页面而没有提示用户尝试不同的凭据(他们甚至不太可能拥有不同的凭据)。