在MVC项目中运行webapi时,此请求错误的授权被拒绝

时间:2016-03-18 15:47:47

标签: asp.net asp.net-mvc asp.net-web-api

我使用WebApi选项创建了一个ASP.Net MVC项目。然后使用以下代码修改值控制器:

public class ValuesController : ApiController
{
    static List<string> data = initList();

    private static List<string> initList()
    {
        var ret = new List<string>();
        ret.Add("value1");
        ret.Add( "value2" );

        return ret;
    }

    // GET api/values
    public IEnumerable<string> Get()
    {
        return data ;
    }

    // GET api/values/5
    public string Get(int id)
    {
        return data[id];
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
        data.Add(value);
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
        data[id] = value;
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
        data.RemoveAt(id);
    }
}

当我运行项目并导航到API /值URL时,以下图像显示错误。

error when running webapi MVC project

文本中的错误说明是:

  

&LT;错误&GT;    此请求已被拒绝授权。   &LT; /错误&GT;

2 个答案:

答案 0 :(得分:0)

查看以下有关

的文章

Authentication and Authorization in ASP.NET Web API

它将解释如何在控制器/操作上使用[Authorize][AllowAnonymous]属性的不同方法以及您需要执行的任何配置。

以下摘自以上链接文章:

  

使用[授权]属性

     

Web API提供内置授权过滤器,   AuthorizeAttribute。此过滤器检查用户是否   认证。如果没有,则返回HTTP状态码401(未授权),   没有调用动作。

     

您可以在控制器级别或全局应用过滤器   等级行动。

     

全局:要限制每个Web API控制器的访问权限,请添加   AuthorizeAttribute过滤到全局过滤器列表:

public static void Register(HttpConfiguration config){
    config.Filters.Add(new AuthorizeAttribute());
}
     

控制器:要限制特定控制器的访问权限,请添加   过滤器作为控制器的属性:

// Require authorization for all actions on the controller.
[Authorize]
public class ValuesController : ApiController
{
    public HttpResponseMessage Get(int id) { ... }
    public HttpResponseMessage Post() { ... }
}
     

操作:要限制特定操作的访问权限,请将属性添加到   行动方法:

public class ValuesController : ApiController
{
    public HttpResponseMessage Get() { ... }

    // Require authorization for a specific action.
    [Authorize]
    public HttpResponseMessage Post() { ... }
}
     

或者,您可以限制控制器然后允许   使用[AllowAnonymous]匿名访问特定操作   属性。在以下示例中,Post方法受到限制,   但Get方法允许匿名访问。

[Authorize] 
public class ValuesController : ApiController {
    [AllowAnonymous]
    public HttpResponseMessage Get() { ... }

    public HttpResponseMessage Post() { ... } 
}
     

在前面的示例中,过滤器允许任何经过身份验证的用户   访问受限制的方法;只有匿名用户才会被拒之门外。您   还可以限制对特定用户或特定角色用户的访问:

// Restrict by user:
[Authorize(Users="Alice,Bob")]
public class ValuesController : ApiController
{
}

// Restrict by role:
[Authorize(Roles="Administrators")]
public class ValuesController : ApiController
{
}

答案 1 :(得分:0)

所以,我已经处理了一段时间了。

起初我不理解它,所以我只是移走并忍受了它。

我终于讨厌它了,因为它很愚蠢。 Microsoft希望用户在登录之前得到授权。

我的错误是寻找要HomeTown的GET方法。就我而言,我已将其更改为CityCode。

由于用户尚未登录,因此没有要获取的CityCode。因此,您将找到402或500资源。

我还是不明白,我给了CityCode一些默认数据。因此,在MeController中,我输入了以下代码:

Public Function [Get]() As GetViewModel

将userInfo设为ApplicationUser = UserManager.FindById(User.Identity.GetUserId())

使用{.CityCode =“ 94110”}返回新的GetViewModel()

结束功能

应用程序现在完全加载无错误。

这是快速解决方案,而不是经过认证的解决方案。