在MVC 4使用自定义授权(Using custom authorization in MVC 4)

2019-09-24 02:44发布

我目前正在开发使用MVC 4个Web API项目类型的Web API。 我目前在这里我需要一些安全添加到API的一个阶段。 我知道了授权属性,然而,客户端将采用不同的方式。 为此,我曾试图重写授权属性在我自己的类作为一个基本的开始,我只是有AuthorizeCore总是返回这应该是指没有经过认证假的。 如果我再在控制器内添加这一个动作,动作总是完成,我总是检索数据。 我认为,其原因可能是由于属性不是在web.config文件正在注册的自定义,但是,我不知道该如何不使用窗体身份验证时,去了解这一点。

我使用的测试代码如下所示的自定义属性新的MVC 4个Web API项目。

public class Auth : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return false;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("http://www.google.com");
    }
}

然后,我已经添加的属性到默认ValuesController这样的Get方法

[Auth]
public IEnumerable<string> Get()

然而,当我浏览到域/ API /价值观我总是呈现的数据,而不是预期的重定向到谷歌。 任何帮助表示赞赏。

编辑:环顾四周一点点经过,我发现这个在这里: http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the -右- way.aspx这表明,我选择了错误的错误AuthorizeAttribute类,因为我选择了从System.Web.MVC的一个,而不是从System.Web.Http之一。 看来,HTTP版本不允许配置为MVC版本相同级别的,因为它不会让我重写AuthorizeCore。 在这个任何更多的帮助表示赞赏。

Answer 1:

看来,这个问题是通过使用AuthorizeAttribute的版本错误引起的。 使用System.Web.Http找到的版本之后,代码返回正确的错误代码,如果用户没有所需的权限。 此处作为一例是等效的代码是什么,我把原来的问题

using System;
using System.Web.Http;
using System.Net.Http;

public class AuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
        response.Headers.Add("Location", "http://www.google.com");
        actionContext.Response = response;
    }
}


Answer 2:

对于的WebAPI,你可以迫使它通过在覆盖指定它覆盖了正确的AuthorizeAttribute类。 此外,它没有意义做一个重定向,这只是返回未经授权的网络响应,这是正确的一个API。

namespace WebApiTest
{
    public class Auth : System.Web.Http.AuthorizeAttribute
    {
        protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            return false;
        }

    }
}


文章来源: Using custom authorization in MVC 4