1

我正在使用自定义授权方案,当用户未获得授权时,我返回一个HttpUnauthorizedResult. 这会导致用户被重定向到登录页面。是否有可能在登录页面中检测到由于授权失败而正在使用它并告诉用户这一点?如果是这样,我该怎么做?

如果我可以告诉用户“您需要以具有 x 角色的用户身份登录才能执行您请求的操作”或类似的内容,那将是一个奖励。

4

3 回答 3

3

与其返回 HTTP 401,不如返回一个包含您想要的消息的网页,以及一个转到登录页面的按钮。

实际上,您认为您正在发送未经授权的响应,但实际上 ASP.NET 正在拦截该 HTTP 401 响应并将 HTTP 302(重定向)发送到您的登录页面。因此,如果您想要自定义消息,只需将自己重定向到您想要的页面。

干杯。

更新:

如果您创建自己的授权过滤器,您可以定义如果用户未获得授权/身份验证会发生什么:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    readonly String _customError;

    public MyAuthorizeAttribute(String customError)
    {
        _customError = customError;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        FormsAuthentication.SignOut();

        filterContext.Controller.TempData["Error"] = _customError;
        filterContext.Result = new RedirectResult("~/Account/yourErrorView");
    }
}

(未测试)

这样你就可以这样使用你的属性:

    [MyAuthorize("You are not authorized to see this thing")]
    public ActionResult MyActionMethod()
    {
        return View();
    }

然后用户将被重定向到“~/Account/yourErrorView”,并在 TempData 中找到自定义错误消息。

干杯。

于 2012-11-30T12:22:08.073 回答
0

使用 ActionFilterAttribute 而不是 AuthorizeFilterAttribute 将其指向您的错误处理页面。

public class RoleAuthorize: ActionFilterAttribute
    {

      public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
             var controller = (YourController)filterContext.Controller;

        try
                {
                    if (!controller.CheckForRoleMethod())
                    {
                        throw new System.Security.SecurityException("Not Authorized!");
                    }
                }
                catch (System.Security.SecurityException secEx)
                {
                    if (secEx != null)
                    {
                        // I use TempData for errors like these. It's just me.
                        TempData["ErrorMessage"] = secEx.Message;
                        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "ErrorHandler" }, { "action", "Error" } });
                    }
                }     

        }

      base.OnActionExecuting(filterContext);
    }

您必须在被装饰的控制器上创建一个单独的方法来检查缓存的用户是否已授权:

public class ApplicationController : Controller
    {
     public bool CheckForRoleMethod(){
          // get formsauthentication details to retrieve credentials
          // return true if user has role else false
     }
 }
于 2012-11-30T15:39:44.683 回答
0

我认为最好传递额外的参数来描述错误的原因,例如:

/帐户/登录?错误=4

并在登录操作中检查是否存在错误。

此外,您可以以不同的方式存储错误消息:会话、cookie。

于 2012-11-30T13:20:35.747 回答