.NET WebApi身份验证

时间:2012-09-20 14:17:16

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

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

我们的任务是编写Api,让第三方能够在我们的系统中创建和查看订单。每个第三方都拥有自己的用户名,并且仅限于基于其所属群组的某些api方法。

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

IIS安装程序 WebSite使用两个Web应用程序命名WidgetStore

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

1 个答案:

答案 0 :(得分:9)

  

有没有办法将Forms Auth凭据从我们的MVC应用程序传递到我们的Web api应用程序?

当然,我们来看一下调用Web API的以下MVC控制器操作:

[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项目中使用的名称相同。