【问题标题】:Claims authorization using Thinktecture.IdentityModel使用 Thinktecture.IdentityModel 声明授权
【发布时间】:2014-07-05 04:23:19
【问题描述】:

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);
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    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 上配置的应用程序池标识),如果 该应用程序不是模拟的。如果应用程序是 冒充 via ,身份将是 匿名用户(通常是 IUSR_MACHINENAME)或经过身份验证的用户 请求用户。”

    我决定抛出一个 403(禁止)错误。所以我的覆盖最终看起来像这样:

    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 将用户扔到登录页面的想法。没有向用户反馈他们为什么会被扔回登录页面,也没有提示用户尝试不同的凭据(他们甚至不太可能拥有不同的凭据)。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2011-01-27
      • 1970-01-01
      • 2012-08-19
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多