Аутентификация DotNetOpenAuth по OpenID Google Apps с использованием MVC - PullRequest
0 голосов
/ 23 сентября 2010

Я пытаюсь приблизить единый вход в систему. В настоящее время наиболее работоспособное решение заключается в том, что пользователь вменяет данные на моем сайте, а затем отправляет его в Google Apps для аутентификации.

Я использую dotnetopenauth для отправки и получения запросов

Это означает, что он не учитывает cookie-файлы для входа в приложения Google, если они присутствуют.

Есть несколько вопросов, касающихся этого. Но ни у кого, похоже, нет ответа на это.

Это текущий код (обратите внимание, что я ограничиваю возможные домены, которые можно использовать только для приложений Google для моего домена):

public ActionResult Authenticate(string returnUrl)
    {
        string input=Request.Form["openid_identifier"]+"@example.com";
        openid.DiscoveryServices.Clear();
        openid.DiscoveryServices.Insert(0, GoogleAppsDiscovery); // it should be first if we don't clear the other discovery services

        var response = openid.GetResponse();
        if (response == null)
        {
            // Stage 2: user submitting Identifier
            Identifier id;
            if (Identifier.TryParse(input, out id))
            {
                try
                {
                    return openid.CreateRequest(input).RedirectingResponse.AsActionResult();
                }
                catch (ProtocolException ex)
                {
                    ViewData["Message"] = ex.Message;
                    return View("Login");
                }
            }
            else
            {
                ViewData["Message"] = "Invalid identifier";
                return View("Login");
            }
        }
        else
        {
            // Stage 3: OpenID Provider sending assertion response
            switch (response.Status)
            {
                case AuthenticationStatus.Authenticated:

                    FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);

                    var results = userstable.Select(response.FriendlyIdentifierForDisplay);

                    if (results.Count() > 0)
                    {
                        Session["FriendlyIdentifier"] = results.ElementAt(0).UserFName;
                        return RedirectToAction("Index", "Home", results.ElementAt(0).UserID);
                    }
                    else
                    {
                        UsersDataModel user = new UsersDataModel();

                        user.OpenID = response.ClaimedIdentifier.ToString();
                        user.UserID = Utils.HashToBase64(response.FriendlyIdentifierForDisplay);
                        user.Type = "Empolyee";
                        userstable.Insert(user);

                        //return RedirectToAction("Register");
                    }

                    if (!string.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                case AuthenticationStatus.Canceled:
                    ViewData["Message"] = "Canceled at provider";
                    return View("Login");
                case AuthenticationStatus.Failed:
                    ViewData["Message"] = response.Exception.Message;
                    return View("Login");
            }

        }
        return new EmptyResult();
    }

Единственная разница между этим кодом и нормальным шаблоном заключается в следующих строках:

openid.DiscoveryServices.Clear();
        openid.DiscoveryServices.Insert(0, GoogleAppsDiscovery); // it should be first if we don't clear the other discovery services

Эти строки корректно настраивают OpenId для обработки ответа от приложений Google.

Как я уже сказал, это работает, только если пользователь сначала вводит свой адрес электронной почты. я не могу найти способ автоматического перенаправления на Google Apps Логин

В обычном gmail, если я передам пользователя: https://www.google.com/accounts/o8/id вместо обработки ввода, google будет вводить данные для входа пользователя на своем сайте, а не на моем. Это пропустит это, если есть куки и просто передаст пользователя прямо на мой сайт без суеты.

Мне бы хотелось, чтобы на моем сайте было такое же поведение при входе в приложения Google.

Кроме того, было бы неплохо, если бы я мог ограничить вход в мой домен приложений Google.

Существует несколько URL-адресов:

https://www.google.com/accounts/o8/site-xrds?hd=example.com или же https://www.google.com/a/example.com/o8/id

Но даже с теми строками кода, которые я указывал ранее, dontnetopenauth отказывается видеть конечную точку openid по любому адресу.

Даже образец в dotnetaopenauth для веб-форм все еще требует ввода данных пользователем.

Любая помощь будет наиболее ценной.

1 Ответ

0 голосов
/ 26 сентября 2010

Пользователь не может вводить данные, и любой Домен Служб Google работает на пользователя, поскольку пользователь может войти в 15 учетных записей Служб Google для доменов, и тогда никто не узнает, какаяпользователь означает, чтобы войти с.

Но так как вы говорите, что хотите, чтобы они могли входить только в свой домен, это просто.Пропустите вопрос у пользователя, и просто представьте, что «example.com» был пользовательским вводом и передайте его в DotNetOpenAuth.Это не обязательно должен быть адрес электронной почты.В любом случае используется только доменное имя.

Тем не менее, не гарантирует , что никто из других провайдеров или доменов не может войти на ваш сайт.Для этого вам нужно отфильтровать возвращаемое IAuthenticationResponse и убедиться, что его свойство Provider соответствует единственному значению, которое вы намереваетесь разрешить.В противном случае могут появиться «незапрошенные утверждения».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...