目前,我有一个销售小部件的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
答案 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项目中使用的名称相同。