可以在自定义 AuthorizeAttribute 中抛出 HttpException(401) 吗?

Is ist ok to throw a HttpException(401) in custom AuthorizeAttribute?

我有一个自定义的 AuthorizeAttribute:

public class MyAuthAttribute:AuthorizeAttribute {
 protected override bool AuthorizeCore(HttpContextBase httpContext) {
    return CurrentUser.Roles.Contains(this.Roles);
 }
}

现在 return Currentuser.Roles 工作得很好。如果它 return 为假,浏览器将显示 401。

但我想添加其他信息,例如要求的角色。因此,我会自己抛出一个异常,而不是 return:

throw new httpException(401,string.Format("User should have been in one of the following roles: {0}",this.Roles);

是否可以在 AuthorizeAttribute 中抛出 401 异常而不是 returning false?或者是否有其他(更好的)方法可以将该信息发送到浏览器?

如果您要发送 401,则只需发送带有 WWW-Authenticate header 的普通 401(如果您未使用使用 WWW-Authenticate 的身份验证形式,则401 是完全不合适的)。如果您想提供额外的信息,请在与该 401 一起出现的自定义 HTML 响应的 body 中提供(仅当用户取消身份验证提示时才会显示)。

对于您可以做某事但选择不允许特定用户这样做的任何其他情况,请使用 403。