Как использовать 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);
}
Другие вопросы по тегам