正如在最少特权上解释的那样,有两种方法可以使用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);
}
}发布于 2014-06-06 16:57:43
不管是谁感兴趣。我终于意识到,这和使用我自己的类名作为属性一样(可笑地)简单。
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上的网络服务,以及IIS7.5上配置的应用程序池标识)。如果应用程序是通过模拟进行模拟的,则标识将是匿名用户(通常为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是怎么想的,因为有一个经过有效认证但未经授权的请求,所以将用户抛到登录页面。对于为什么会将它们抛回登录页面,没有任何反馈给用户,也没有任何提示用户尝试不同的凭据(这是非常不可能的,他们甚至有不同的凭据)。
https://stackoverflow.com/questions/23699959
复制相似问题