我正在尝试在使用默认Microsoft.AspNet.Identity.UserManager和Microsoft.AspNet.Identity.Owin.SignInManager的MVC应用程序中实现自定义单一登录方案。要求是将用户名作为参数安全地传递给WebAPI控制器方法,并且如果在存储中找到该用户,则应在MVC应用程序中对其进行身份验证和登录。想法是对用户进行远程身份验证,以便在导航到MVC应用程序时不会将用户重定向到“登录”视图。
以下示例代码在应用程序内部调用时对用户进行身份验证和登录:
public ActionResult LoginLocal()
{
var owinCtxt = System.Web.HttpContext.Current.Request.GetOwinContext();
var userManager = owinCtxt.GetUserManager<ApplicationUserManager>();
var userName = "existingUser";
var user = userManager.FindByName(userName);
if (user == null)
{
throw new ArgumentException(string.Format("User \"{0}\" not found in store.", userName));
}
var identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
owinCtxt.Authentication.SignIn(identity);
return RedirectToAction("Index");
}
但是,当从WebAPI控制器执行此代码时,虽然我可以看到正确创建了身份声明,但未对用户进行身份验证。检查响应时,它包含设置了Set-Cookie
的{{1}}头,但是后续请求不提供此cookie。
处理这种情况的正确方法是什么?我是Owin身份验证管道的新手,最初认为Asp.Net.ApplicationCookie
是可行的方法,但是我没有使用第三方身份验证提供程序,并且用户身份是本地的。