在我的应用程序中,我所有的身份验证都发生在谷歌 - 即 - 我所有用户都是谷歌帐户。
我不需要用户在我的应用中注册,只需使用 Google 帐户登录即可。 但是,我确实想为具有 ASP.net 身份的用户管理角色(我认为(
考虑到这一点,在成功的外部身份验证后,我创建了一个 ASP.net Identity用户(如果不存在(
所以,我有我的ExternalLoginCallback如下:
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var authenticationManager = Request.GetOwinContext().Authentication;
var loginInfo = await authenticationManager.GetExternalLoginInfoAsync();
//successfully authenticated with google, so sign them in to our app
var id = new ClaimsIdentity(loginInfo.ExternalIdentity.Claims, DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(id);
//Now we need to see if the user exists in our database
var user = UserManager.FindByName(loginInfo.Email);
if (user == null)
{
//user doesn't exist, so the user needs to be created
user = new ApplicationUser { UserName = loginInfo.Email, Email = loginInfo.Email };
await UserManager.CreateAsync(user);
//add the google login to the newly created user
await UserManager.AddLoginAsync(user.Id, loginInfo.Login);
}
return RedirectToLocal(returnUrl);
}
想法是,我现在可以管理用户,添加角色,检查用户是否在角色中等。
首先,这是一个明智的方法吗?还是我把它复杂化了?
但是,我遇到的一个问题是注销我的应用程序
我的Logout
操作如下所示:
public ActionResult LogOut()
{
HttpContext.GetOwinContext().Authentication.SignOut();
return RedirectToAction("Index", "Home");
}
我的索引操作使用 [授权] 属性修饰 -但是,当我"注销"时 - 它重定向到 Home.Index - 但我似乎仍然登录?
根据此ASPNet标识工作项,这是设计使然,您需要直接调用Google的API才能将用户注销。
使用返回 URL (OAuth( 完成帖子注销链接这是一个对我有用的解决方案:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return Redirect("https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://[url-of-your-site]");
}