如何使用OWIN和Identity对注册用户进行身份验证?



我有两个项目,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 });
}

相关内容

  • 没有找到相关文章

最新更新