首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Thinktecture.IdentityModel的索赔授权

使用Thinktecture.IdentityModel的索赔授权
EN

Stack Overflow用户
提问于 2014-05-16 16:11:33
回答 1查看 3.2K关注 0票数 2

正如在最少特权上解释的那样,有两种方法可以使用Thinktecture.IdentityModel设置索赔授权检查。一个是设置一个过滤器。另一种方法是向要检查的操作添加属性。

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

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

代码语言:javascript
复制
    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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-06 16:57:43

不管是谁感兴趣。我终于意识到,这和使用我自己的类名作为属性一样(可笑地)简单。

代码语言:javascript
复制
CustomClaimsAuthorizeAttribute("myParameter")
public ActionResult Index()
{
  ...
}

此外,我发现即使在我的web.config文件中有以下内容,抛出的UnauthorizedAccessException也不会向用户显示指定的401错误页。相反,它们将接收通用错误页面。

代码语言:javascript
复制
<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上的网络服务,以及IIS7.5上配置的应用程序池标识)。如果应用程序是通过模拟进行模拟的,则标识将是匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户。“

相反,我决定抛出一个403 (禁止)错误。所以我的覆盖结果是这样的:

代码语言:javascript
复制
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错误页指定为:

代码语言:javascript
复制
<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是怎么想的,因为有一个经过有效认证但未经授权的请求,所以将用户抛到登录页面。对于为什么会将它们抛回登录页面,没有任何反馈给用户,也没有任何提示用户尝试不同的凭据(这是非常不可能的,他们甚至有不同的凭据)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23699959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档