如何在WebApi上授权用户,如果用户在应用程序中已经经过身份验证。

23 浏览
0 Comments

如何在WebApi上授权用户,如果用户在应用程序中已经经过身份验证。

我有一个带有WebAPI控制器的MVC应用程序。

当用户通过身份验证后,他可以访问应用程序中的所有MVC [Authorize] 控制器操作。但由于某种原因,当我在位于应用程序中的WebApi控制器上设置[Authorize]属性时,经过身份验证的用户无法访问此WebApi操作,服务器返回401 Unauthorized

[Authorize]
public class FilesController : ApiController

通过研究,我发现WebApi的[Authorize]属性实际上是System.Web.Http.AuthorizeAttribute,而对于mvc控制器,它是System.Web.Mvc.AuthorizeAttribute

是否有办法设置应用程序,以便如果用户在mvc控制器级别获得授权,则他也将被授权访问webapi?

我尝试将WebApi属性更改为[System.Web.Mvc.Authorize],但似乎不起作用。

看起来我必须做类似于使用这个链接中的的事情。

你有什么想法吗?

0
0 Comments

问题的出现原因:

MVC和Web API的身份验证/授权过滤器有着不同的行为,因此很难将它们放入一个单一的过滤器中。在MVC请求中,当用户在授权过程中失败时,我们希望将其重定向到另一个页面,要么让其以其他用户身份登录,要么让其知道他们无权访问该页面。而在Web API请求中,当用户在授权过程中失败时,我们希望发送一个表示授权失败的HTTP状态码,让客户端自行处理。

解决方法:

为了解决这个问题,我们可以使用两个不同的身份验证/授权过滤器,一个用于MVC请求,另一个用于Web API请求。这样,我们可以根据请求的类型选择适当的过滤器来处理身份验证和授权。

对于MVC请求,我们可以使用MVC框架提供的[Authorize]特性来标记需要进行身份验证和授权的控制器或操作方法。当用户在授权过程中失败时,MVC框架会自动将其重定向到指定的登录页面或显示相应的错误信息。

对于Web API请求,我们可以创建一个自定义的身份验证/授权过滤器。这个过滤器可以继承自System.Web.Http.AuthorizeAttribute类,并重写其中的一些方法来实现我们自己的身份验证和授权逻辑。当用户在授权过程中失败时,我们可以在重写的方法中发送一个表示授权失败的HTTP状态码。

以下是一个示例的Web API身份验证/授权过滤器的代码:

public class CustomAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        // 自定义身份验证逻辑
        bool isAuthorized = ...;
        return isAuthorized;
    }
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    {
        // 发送HTTP状态码表示授权失败
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
    }
}

然后,我们可以在需要进行身份验证和授权的Web API控制器或操作方法上使用这个自定义过滤器:

[CustomAuthorize]
public class MyApiController : ApiController
{
    // ...
}

通过使用不同的身份验证/授权过滤器,我们可以根据请求类型来处理身份验证和授权,并实现不同的行为。这样,我们既能够在MVC请求中将用户重定向到另一个页面,又能够在Web API请求中发送适当的HTTP状态码。

0