【问题标题】:Authorization has been denied for this request error when running webapi in MVC project在 MVC 项目中运行 webapi 时,此请求错误的授权已被拒绝
【发布时间】:2020-07-02 10:48:42
【问题描述】:

我创建了一个带有 WebApi 选项的 ASP.Net MVC 项目。然后用下面的代码修改了 values 控制器:

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/values URL 时,下图显示错误。

.

文本中的错误描述是:

此请求的授权已被拒绝。 错误>

【问题讨论】:

  • 将 [AllowAnonymous] 添加到控制器
  • 感谢您的回复。这解决了我的错误。但是我需要知道 [Authorize] 是否添加到控制器中,我是否需要配置一些东西才能运行我的控制器?

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


【解决方案1】:

看看下面这篇关于

的文章

Authentication and Authorization in ASP.NET Web API

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

以下内容摘自上面的链接文章:

使用 [Authorize] 属性

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
{
}

【讨论】:

    【解决方案2】:

    所以,我一直在处理这个错误。

    一开始我不明白,所以我就删掉了,就这样生活下去了。

    我终于厌倦了它,因为它相当愚蠢。 Microsoft 希望用户在登录之前获得授权。

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

    由于用户未登录,因此没有可获取的 CityCode。因此,您会得到 402 或 500 Resource Not Found。

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

    Public Function [Get]() As GetViewModel
    

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

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

    结束函数

    应用现在加载完全没有错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多