Я пытаюсь приблизить единый вход в систему. В настоящее время наиболее работоспособное решение заключается в том, что пользователь вменяет данные на моем сайте, а затем отправляет его в 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 для веб-форм все еще требует ввода данных пользователем.
Любая помощь будет наиболее ценной.