通过Orchard CMS中的ASP.NET Web API进行授权

时间:2014-02-18 20:17:15

标签: c# asp.net-web-api orchardcms

在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中的注册用户进行匹配?或者流程中是否缺少步骤?

2 个答案:

答案 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控制器会调用执行实际工作负载的服务。您可以直接从您的驱动程序/操作中调用此服务,但仍然知道您的业务逻辑位于服务接口之后。