Как использовать DotNetOpenAuth для входа на сайты? - PullRequest
1 голос
/ 20 апреля 2011

Я хочу сделать так, если пользователи вошли в 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 ]

3 голосов
/ 20 апреля 2011

Звучит так, будто вы запрашиваете «единый вход», когда посетитель вашего сайта, уже вошедший в Google, сразу же входит на ваш сайт при первом посещении, а не после нажатияКнопка "Google Login" на вашем сайте.

Короткий ответ: вы не можете этого сделать.Более длинный ответ заключается в том, что вы можете приблизиться.

Первое и жесткое ограничение заключается в том, что посетители, впервые посещающие ваш сайт, никогда не будут автоматически входить в систему, поскольку Google и пользователь еще не доверяют вашему сайту.Каждый пользователь должен войти в систему один раз, и Google спросит пользователя: «Вы хотите войти на этот сайт и запомнить этот выбор?»Если он скажет «да», то в будущем, когда пользователь уже вошел в Google и заходит на ваш сайт, он может нажать кнопку входа в Google на вашем сайте и никогда не увидит Google - он просто сразу же войдет в вашsite.

Итак, следующий вопрос - как убрать требование с пользователя нажимать кнопку «Войти в Google».Вы можете сделать это, когда неаутентифицированный пользователь заходит на ваш сайт, вы можете сразу же перенаправить его на страницу входа в систему, которая немедленно инициирует поток «Google Login» (вызов OpenIdRelyingParty.CreateRequest(google).RedirectToProvider()), используя «немедленный режим».Это не удастся, если пользователь не вошел в Google и не доверяет вашему сайту, но это повлияет на то, что пользователь не увидит экран входа в Google, если он сделает доверяет вашему сайту, а скорее сразуавторизовался.

0 голосов
/ 20 апреля 2011

Мой ответ может оказаться полезным: Какое решение 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...