在Orchard CMS中创建ASP.NET Web API模块非常简单明了。以下链接说明了如何做到这一点并且工作得很好。 http://www.sebastienros.com/web-api-makes-it-in-orchard
但是,当WebAPI在Orchard下运行并且您同时使用[Authorize]
属性时,GET请求不起作用。
[Authorize]
public IEnumerable<string> Get()
{
return _moduleManager.GetUsers().Select(n => n.UserName);
}
当我从客户端打电话时
HttpClientHandler handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential("user", "password");
HttpClient client = new HttpClient(handler);
var response = await client.GetAsync("http://localhost:30321/OrchardLocal/api/MyWebAPIModule/Users");
Console.WriteLine(response);
response
变量返回Orchard的“Not found”HTML页面。如果没有[Authorize]
,则会返回用户列表。
Orchard是否已经内置了一些内容来将凭据与Orchard中的注册用户进行匹配?或者流程中是否缺少步骤?
答案 0 :(得分:0)
This blog post可能是更深入理解ASP.NET的Authorize属性的有用资源。查看web.config文件可能有助于查看身份验证模式的设置。
答案 1 :(得分:0)
我认为问题在于,如果您在代码中进行呼叫,则需要在请求中传递任何cookie。
通过使用浏览器提供的aspnetAuth(或FedAuth)cookie,用户通过网站进行身份验证。因此,如果您从浏览器调用/ OrchardLocal / api / MyWebAPIModule / Users,您可以期望这样做(您应该通过查看标题/ cookie来看到这在fiddler中发生)。
但是,如果您在代码中拨打电话,则需要传递cookies / auth。自己头。你有的电话没有这个,所以它失败了(你应该看到fiddler中没有这个请求的cookie)。
我不确定你为什么要从你自己的模块中以这种方式调用api。据推测,API控制器会调用执行实际工作负载的服务。您可以直接从您的驱动程序/操作中调用此服务,但仍然知道您的业务逻辑位于服务接口之后。