我有两个项目,MVC web应用程序和web服务。在MVC web应用程序我有一个控制器称为"帐户"。在"帐户"中有一个名为"登录"的操作。"Login"动作从请求中获取身份验证管理器。"Login"操作调用web服务来识别用户是否存在。如果用户存在,web服务将为该特定用户返回'ClaimsIdentity'。然后,"Login"操作将使用身份验证管理器和声明标识来登录用户。
在此之后,不对用户进行签名/认证。我知道这是因为User.Identity.Name是空的,而User.Identity.IsAuthenticated是假的。需要解释为什么会发生这种情况,我能做些什么来解决这个问题。没有构建时或运行时错误。我需要web服务来执行对数据库的所有调用。
账户。登录代码
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult LogIn(LoginModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var authManager = GetAuthenticationManager();
var loginFeedback = _webService.Login(model);
if (loginFeedback.Success)
{
authManager.SignIn(loginFeedback.Identity);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", loginFeedback.FeedbackMessage);
return View(model);
}
}
GetAuthenticationManager
private IAuthenticationManager GetAuthenticationManager()
{
var context = Request.GetOwinContext();
return context.Authentication;
}
Web服务登录
public LoginFeedbackDto Login(LoginModel loginModel)
{
var userManager = GetUserManager();
var user = userManager.Find(loginModel.Email, loginModel.Password);
var dto = new LoginFeedbackDto();
string status = user.Status.ToLower();
if (status == "invalid")
{
dto.Success = false;
dto.FeedbackMessage = @"This account has not been activated.";
}
else if (status == "rejected")
{
dto.Success = false;
dto.FeedbackMessage = @"This account has been rejected.";
}
else if (status != "invalid" && status != "rejected" && status != "processed")
{
dto.Success = false;
dto.FeedbackMessage = @"We are unable to log you in due to a technical issue.";
}
else
{
dto.Success = true;
dto.Identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
}
userManager.Dispose();
return dto;
}
这里发生的是你正在创建的身份在RedirectToAction上被'丢失'。
你可以使用CookieMiddleware,它可以创建一个代表当前用户的cookie。你需要一个Owin启动类,它需要像下面这样的代码。
确保'SelfIssue'与你的webservice为ClaimsIdentity设置的AuthenticationType相同。AuthenticationType。
public const string SelfIssue = "Self-Issue";
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(SelfIssue);
app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = SelfIssue });
}