我有一个Web API,目前AngularJS应用程序在ASP.NET MVC Web应用程序中使用 . MVC应用程序使用ASP.NET Forms Authentication作为身份验证机制 . 当客户端不是Web客户端时,我应该如何验证Web API的用户,例如一个独立的服务 . 我现在所做的是为Web API添加一个登录方法,该方法可以为任何人提供正确的凭据访问权限:
[Route("api/v2/login"), HttpPost]
[AllowAnonymous]
public IHttpActionResult Post([FromBody]Credentials credentials)
{
var principal = FindPrincipal(credentials);
if (principal != null)
{
FormsAuthentication.SetAuthCookie(principal.Identity.Name, false);
return Ok();
}
return Unauthorized();
}
我的问题是,如果这应该如何解决或者是否有更好的方法?
1 回答
您可以使用WebApi2的令牌认证机制 .
流程将是这样的事情:
用户向您发送https请求:
https://yourApiUrl/Token
请求的内容类型应为:
身体应包括:
你的OWIN启动类看起来像这样:
注意上面的YourOAuthProvider,这是重要的部分 . 这是您的自定义提供程序,它将根据您拥有的凭据存储来验证您的用户名/密码 . 在你的情况下aspnet_membership表 . 此验证在RequestHasValidCredentials方法中完成:
您的用户将获得上述响应将是一个令牌,其中包括用户名或您在上述方法中添加到上下文中的任何其他信息:
来自上述令牌api调用的响应将是这样的:
然后,您的用户必须将此标记作为所有API调用的Http Authorization标头传递 . 他们需要使用承载方案,例如:
由于此令牌包含用户名,您将能够知道该用户是谁 . 现在最后一件事是阅读此令牌并检索用户名 . 为此,您需要创建自定义Authorize属性,并使用它来装饰您的控制器或方法 .
一旦您拥有用户名,就可以在此处添加所有其他自定义授权逻辑 .
您可以在生成令牌时传递其他自定义信息,并在此处阅读 . (如果您需要任何其他特殊授权逻辑 . )
它冗长的方法,但将工作将任何凭据存储 .