想要创建许多站点将使用的通用Web API登录

时间:2015-04-01 13:47:45

标签: c# asp.net-web-api asp.net-mvc-5

我们需要创建一个仅用于身份验证/授权的简单站点。它将使用最新的OAuth和OWIN以及Microsoft Identity。我假设WebAPI是要走的路,但我是新手和MVC,所以让我知道是否有更好的方法。

我创建了一个简单的登录服务Web API ,它有一个Account控制器。以下是我将使用的Login操作:

[AllowAnonymous]
public ActionResult Login(string returnUrl) {
  ViewBag.ReturnUrl = returnUrl;
  return View();
}

这是一个简单的客户端网络应用,可以调用登录服务应用

public async Task<ActionResult> Index() {
  var client = new HttpClient();
  var response = await client.GetAsync("http://localhost:19604/Account/Login");
  string thing = await response.Content.ReadAsStringAsync();

  return Content(thing);
}

这会返回我想要的EmailPasswordRemember me等视图。但是,按钮不起作用。当我点击Login按钮时,我在/Account/Login上获得 404 。我怀疑这是因为WebAPI控制器不再连接,客户端没有Account控制器。

return Content(thing);导致问题并打破它吗? 我是否需要对登录服务上的操作进行硬编码才能转到特定的URL? 或者我想要做的就是不可能?

最后,我希望这个登录服务Web API 能够返回带有登录用户声明的凭证/令牌,就像我通过客户端应用程序本身登录一样。

1 个答案:

答案 0 :(得分:0)

首先,您的WebApi controllers 不会返回视图 。他们返回IHttpActionResult(以更合理的方式,他们返回HTTP代码)

Login按钮最好转到Mvc上下文中的login action of the account controller

除非您以自定义方式执行此操作,否则无法直接执行您想要的操作。

例如

  1. 点击Login按钮,将呼叫重定向到控制器内的private method
  2. 在此私有方法中调用WebApi项目的登录方法。
  3. 如果登录成功,(例如,如果返回 HTTP 200 ),则将呼叫重定向到相应的Mvc controller。如果没有,(例如, HTTP 404 错误)请转到custom error page
  4. 否则,您可以实施自定义成员资格。使用[ CustomMembershipAttribute ](here)属性装饰控制器。见here

    作为旁注: 我更喜欢使用RestSharp而不是创建HttpClient的新实例并使用它。代码看起来很笨拙;)