.NET WebApi身份验证

6

目前,我有一个MVC Web应用程序,用于销售小部件。用户使用表单身份验证登录到我们的系统中,并且可以根据所属组执行各种功能(如下订单、查看订单、取消订单等)。

我们被要求编写一个API,使第三方能够在我们的系统中创建和查看订单。每个第三方都将拥有自己的用户名,并且基于所属组将受到某些API方法的限制。

我们正在考虑使用Web API作为提供API的机制。我们还希望能够从我们的MVC Web应用程序中使用此API。不幸的是,我们在Web API的身份验证方面遇到了问题。使用DelegatingHandler,我们已经实现了SSL上的基本身份验证以用于我们的Web API。这对我们的第三方非常有效。然而,当尝试从我们的MVC应用程序中使用API时,由于用户是通过Forms身份验证在MVC应用程序中进行身份验证的,但我们没有办法将这些凭据传递给Web API,因此我们收到了401访问被拒绝的错误。是否有一种方法可以将Forms Auth凭据从我们的MVC应用程序传递给我们的Web API应用程序?

IIS设置 名为WidgetStore的网站,其中包含两个Web应用程序

  • WidgetStore\UI-使用表单身份验证
  • WidgetStore\Api-使用基本身份验证

为了解决您的表单/基本身份验证问题,我建议您阅读Dominick Baier的这篇优秀文章:Forms / Basic auth claims transformation - JuChom
1个回答

9
有没有一种方法可以将 Forms Auth 凭据从我们的 MVC 应用程序传递给我们的 Web API 应用程序?
当然,让我们以以下 MVC 控制器操作调用 Web API 为例:
[Authorize]
public ActionResult CallWebApi()
{
    var baseAddress = new Uri("https://example.com");
    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
    {
        var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName].Value;
        cookieContainer.Add(baseAddress, new Cookie(FormsAuthentication.FormsCookieName, authCookie));
        var result = client.GetAsync("/api/values").Result;
        result.EnsureSuccessStatusCode();

        // now you can read the result.Content ...
    }
}

假设您在Web API项目的web.config文件中也启用了表单身份验证,并且cookie名称与您在MVC项目中使用的相同。

感谢您的回复。但是,如果我在Web API项目的web.config中启用FormsAuthentication,则第三方将无法进行身份验证。他们使用基本身份验证连接到WebApi,这将不再起作用。第三方将无法获得FormsAuth cookie。 - user1686249
但是你的基本表单身份验证委托处理程序是什么样子的呢?如果它看起来像这样,启用表单身份验证就不会有问题:https://dev59.com/dWgu5IYBdhLWcg3wJT9I#11536349 - Darin Dimitrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接