如何确保所有对asp web api的调用都是经过授权的?

时间:2014-07-14 12:22:43

标签: c# asp.net asp.net-web-api asp.net-identity asp.net-web-api2

我正在使用asp web api 2和asp身份构建saas应用程序。此API将由Web,移动和桌面应用程序使用。如何确保所有对我的web api方法的调用都是经过授权的?在网络上,我们可以要求用户在访问某个页面之前登录,但是如何回合移动/桌面?用户是否需要在每次通话时提供登录名和密码?有更好的解决方案吗?我一直在寻找并没有找到任何关于此的文章。非常感谢一个或多个样本。

1 个答案:

答案 0 :(得分:1)

通常在使用api作为后端时,您必须在每次请求时对用户进行身份验证。
(它实际上也发生在其他框架上,例如mvc.net,但它们使用cookie跟踪用户,这些cookie随每次请求来回发送)

我建议您使用基于令牌的身份验证(例如OAuth)。在这种情况下,您可以在请求的标头中设置令牌。此令牌将用于验证(并可能授权)用户。

如果您需要更多信息,我可以随时解释一下。

==编辑:添加了代码示例==

您可以使用请求处理程序来验证请求的标头是否包含有效标记:

public class AuthorizationHeaderHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage pRequest, CancellationToken pCancellationToken)
    {
        IEnumerable<string> apiKeyHeaderValues = null; 
        if (!pRequest.Headers.TryGetValues("Authorization", out apiKeyHeaderValues)
            || !TokenRepo.IsVallidToken(apiKeyHeaderValues))
        {
            var response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
                Content = new StringContent("{\"error\": \"invalid_token\"}")
            };
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            return Task.Factory.StartNew(() => response);
        }
        return base.SendAsync(pRequest, pCancellationToken);
    }
}

您所要做的就是保持哪个令牌与哪个用户相关联,并确保令牌有一个有效期。一旦通过,它也将无效。

我希望这会澄清一点。 同样,如果您有更多问题,请不要犹豫。