我正在使用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) . 但似乎这不是正确的方式 .