我正在使用Vue.js前端和ASP.NET WebApi后端将ASP.NET WebForms应用程序迁移到单页应用程序(应用程序将在不同的域中运行) .
我需要实现两种身份验证方案:
1)用户通过他的登录名和密码进行身份验证 . 登录名和密码通过ajax发送到服务器,由OWIN中间件处理,承载令牌返回给客户端 .
2)用户将其证书提供给服务器 . 服务器检查证书,通过证书序列号查找用户,并返回承载令牌(如果找到用户) .
然后,将承载令牌存储并作为对api的任何其他请求的一部分发送 .
方案#2的问题在于,只有在发出直接请求(在地址栏中输入URL)时才会显示浏览器证书选择对话框 . 如果请求是通过Javascript发送的 - 则不会询问证书而不会发送证书 . 因此,使用此功能的唯一方法是将用户重定向到WebApi Url(配置为requireSsl) .
因为所有使用令牌的工作都是在OWIN中完成的,所以我不知道究竟要放在我自己的控制器方法中:
public class AuthController : Controller
{
//User gets redirected here
public ActionResult AuthByCertificate()
{
if (Request.ClientCertificate.IsPresent)
{
//var user = find user by Request.ClientCertificate.SerialNumber
//var bearerToken = //generate bearer token - how?
//return Redirect("https://client_app_url/#"+bearerToken);
}
else
{
//Return some bad result
}
}
}
由于最好将所有身份验证放在一个地方,我也希望将登录密码处理放在我的控制器中(即用户在webapi中进行身份验证,然后重定向到vue clientapp) . 但似乎这不是正确的方式 .