Как использовать DotNetOpenAuth для входа на сайты?
Я хочу сделать это, если пользователи вошли в Gmail и если они зашли на мой сайт, они автоматически вошли в систему.
Я делаю это следующим образом... может быть, есть лучший способ сделать это.
На моем веб-сайте есть место, где пользователи могут указать свой адрес электронной почты, чтобы мой веб-сайт знал адрес зарегистрированного пользователя.
Поэтому, когда они заходят на мой сайт, я хочу знать, вошли ли они в Gmail и каков их адрес Gmail.
Как мне найти эту информацию, используя DotNetOpenAuth?
Я нашел следующий код из Интернета, и он аутентифицирует пользователя. Но я должен нажать на кнопку и каждый раз заходить в Gmail. если пользователь уже использует Gmail, мне не нужно спрашивать у пользователя логин, я могу его использовать. Как мне изменить этот код для достижения этого?
static string openidurl = "https://www.google.com/accounts/o8/id";
protected void Page_Load(object sender, EventArgs e)
{
//The Response
OpenIdRelyingParty openid = new OpenIdRelyingParty();
var response = openid.GetResponse();
if (response != null)
{
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
var fetch = response.GetExtension<FetchResponse>();
string email = "";
if (fetch != null)
{
email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
}
break;
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
using (OpenIdRelyingParty openid = new OpenIdRelyingParty())
{
IAuthenticationRequest request = openid.CreateRequest(openidurl);
var fetch = new FetchRequest();
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
request.AddExtension(fetch);
// Send your visitor to their Provider for authentication.
request.RedirectToProvider();
}
}
2 ответа
Похоже, что вы запрашиваете "единый вход", когда посетитель вашего сайта, который уже вошел в Google, сразу же регистрируется на вашем сайте при первом посещении, а не после нажатия "Вход в Google". кнопку на вашем сайте.
Короткий ответ: ты не можешь сделать это. Чем дольше ответ, так это тем, что вы можете подобраться ближе.
Первое и жесткое ограничение заключается в том, что посетители, впервые посещающие ваш сайт, никогда не будут автоматически входить в систему, поскольку Google и пользователь еще не доверяют вашему сайту. Каждый пользователь должен войти в систему один раз, при этом Google спрашивает пользователя: "Вы хотите войти на этот сайт и запомнить этот выбор?" Если он скажет "да", то в будущем, когда пользователь уже вошел в Google и заходит на ваш сайт, он может нажать кнопку "Вход в Google" на вашем сайте и никогда не увидит Google - он просто сразу же войдет в вашу учетную запись. сайт.
Поэтому следующий вопрос - как убрать требование с пользователя нажимать кнопку "Войти в Google". Вы можете сделать это, когда неаутентифицированный пользователь заходит на ваш сайт, вы можете сразу же перенаправить его на страницу входа в систему, что немедленно инициирует поток "Google Login" (OpenIdRelyingParty.CreateRequest(google).RedirectToProvider()
вызов), используя "немедленный режим". Это не удастся, если пользователь не залогинен в Google и не доверяет вашему сайту, но это повлияет на то, что пользователь не увидит экран входа в Google, если он действительно будет доверять вашему сайту, а скорее сразу войдет в систему.
Возможно, вы найдете мой ответ полезным: какое решение OpenID действительно используется в Stack Overflow?
Я также сделал простую запись в блоге об этом: http://codesprout.blogspot.com/2011/03/using-dotnetopenauth-to-create-simple.html
Мои примеры с MyOpenID, но Gmail должен работать так же. Поставщик OpenID в основном заботится о входе в систему, включая случай, когда они уже вошли в систему с поставщиком.
Обновить:
В приложении ASP.NET (в данном случае ASP.NET MVC) вы создадите файл cookie, когда пользователь успешно вошел в систему, и вы проверите файл cookie, чтобы определить, вошел ли пользователь в систему. Как я уже сказал, см. Ссылки выше для подробных примеров кода и объяснения того, как все это работает. Вот два примера кода из контроллера, где я демонстрирую, как проверить, вошел ли пользователь в систему:
// **************************************
// URL: /User/LogIn
// **************************************
public ActionResult LogIn()
{
if (User.Identity.IsAuthenticated) // <--- CHECKS IF THE USER IS LOGGED IN
{
return RedirectToAction("Profile", "User");
}
Identifier openID;
if (Identifier.TryParse(Request.QueryString["dnoa.userSuppliedIdentifier"], out openID))
{
return LogIn(new User { OpenID = openID }, Request.QueryString["ReturnUrl"]);
}
else
{
return View();
}
}
[HttpPost]
public ActionResult LogIn(User model, string returnUrl)
{
string openID = ModelState.IsValid?model.OpenID:Request.Form["openid_identifier"];
if (User.Identity.IsAuthenticated)//<--- CHECKS IF THE USER IS LOGGED IN
{
return RedirectToAction("Profile", "User");
}
else if (!string.IsNullOrEmpty(openID))
{
return Authenticate(openID, returnUrl);
}
else if(ModelState.IsValid)
{
ModelState.AddModelError("error", "The OpenID field is required.");
}
// If we got this far, something failed, redisplay form
return View(model);
}