我正在重构一个旧网站以使用OWIN,并使用ASP Identity 2.
的表格和外部登录声明。我有一个问题,围绕着创建外部登录的新用户的正确方法。
我正在使用MVC脚手架代码,但具有自定义UserStore
,UserManager
和SignInManager
,并且一切都在工作。
在ExternallogIncallback方法中,帐户控件具有评论的情况,可以重定向到外部符合用户时,但是我不确定在哪里可以短路登录逻辑,因此不会引发例外。
var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
case SignInStatus.Failure:
default:
// If the user does not have an account, then prompt the user to create an account
ViewBag.ReturnUrl = returnUrl;
ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
}
SignInManager.ExternalSignInAsync()
方法以以下方式流过UserStore
和UserManager
和SignInManager
。在哪里以及如何简化逻辑以获取结果作为故障的最佳方法?
AccountController : ExternalLogin(Provider, returnURL)
我的OWIN中间件
accountController:externalloginCallbackAuthenticationManager返回所有详细信息
usermanager:task findAsync(userLoginInfo)调用USERSTORE:task findAsync(userLoginInfo)UserLoginInfo有提供商和密钥,这是我发现系统中没有用户的地方。无论我返回什么任务,都不会停止流程。
...USERSTORE:锁定和其他MISC的东西 - 即使是空的,也需要用户对象...
signManager:任务签名(用户,持久性,remeber) - 用户对象为空
signManager:task createuseristentityAsync(用户) - 用户对象是空的
用户:任务生成uSERATESERIDENTYASYNC(USERMANAGER MANAGAR)
usermanager:createIdentityAsync(用户,auth类型)用户是空的,auth type =&quot'ofterne cookie;这会抛出无效的异常。
找到解决方案。我可以从usermanager findasync方法返回一个空任务,这将导致失败结果。
return Task.FromResult<MyUser>(null);