未经授权的webapi调用返回登录页面而不是401

如何配置我的mvc / webapi项目,以使从剃刀视图调用的webapi方法在未经授权时不返回登录页面?

它是一个MVC5应用程序,还具有用于通过javascript进行调用的WebApi控制器。

下面的两种方法

[Route("api/home/LatestProblems")]      

[HttpGet()]

public List<vmLatestProblems> LatestProblems()

{

// Something here

}

[Route("api/home/myLatestProblems")]

[HttpGet()]

[Authorize(Roles = "Member")]

public List<vmLatestProblems> mylatestproblems()

{

// Something there

}

通过以下角度代码调用:

angular.module('appWorship').controller('latest', 

['$scope', '$http', function ($scope,$http) {

var urlBase = baseurl + '/api/home/LatestProblems';

$http.get(urlBase).success(function (data) {

$scope.data = data;

}).error(function (data) {

console.log(data);

});

$http.get(baseurl + '/api/home/mylatestproblems')

.success(function (data) {

$scope.data2 = data;

}).error(function (data) {

console.log(data);

});

}]

);

因此,我尚未登录,第一个方法成功返回了数据。第二种方法返回(在成功函数中)包含登录页面等效项的数据。例如,如果您请求带有[Authorize]标记的控制器操作并且尚未登录,则在mvc中会得到什么。

我希望它返回未经授权的401,以便我可以根据用户是否登录为用户显示不同的数据。理想情况下,如果用户已登录,则我希望能够访问Controller的User属性,以便我可以返回特定于该Member的数据。

回答:

有两种AuthorizeAttribute实现,您需要确保为Web API引用了正确的实现。有

System.Web.Http.AuthorizeAttribute 这是用于Web

API的,并且 System.Web.Mvc.AuthorizeAttribute 这是用来与视图控制器。

如果授权失败,则 Http.AuthorizeAttribute 将返回401错误,并且 Mvc.AuthorizeAttribute

将重定向到登录页面。

因此,正如布罗克·艾伦(Brock Allen)在他的文章中指出的那样,随着MVC

5的出现,情况发生了巨大变化。我猜想OWIN管道会接管并引入一些新行为。现在,当未授权用户时,将在HTTP标头中返回状态200和以下信息。

X-Responded-JSON: {"status":401,"headers":{"location":"http:\/\/localhost:59540\/Account\/Login?ReturnUrl=%2Fapi%2FTestBasic"}}

您可以在客户端更改逻辑,以检查标头中的此信息以确定如何处理此信息,而不是在错误分支上查找401状态。

我试图通过在 OnAuthorizationHandleUnauthorizedRequest 方法的响应中设置状态来覆盖自定义

AuthorizeAttribute中 的此行为。

actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);

但这没有用。新管道必须稍后再获取此响应,并将其修改为我之前获得的响应。抛出HttpException也不起作用,因为它只是更改为500错误状态。

我测试了Brock Allen的解决方案,当我使用jQuery

ajax调用时它确实起作用。如果它对您不起作用,我猜是因为您使用的是角度。用Fiddler运行测试,看看标题中是否包含以下内容。

X-Requested-With: XMLHttpRequest

如果不是,那就是问题所在。我不熟悉angular,但是如果它允许您插入自己的标头值,然后将其添加到您的ajax请求中,则它可能会开始工作。

以上是 未经授权的webapi调用返回登录页面而不是401 的全部内容, 来源链接: utcz.com/qa/413557.html

回到顶部