Безопасный единый вход в ASP.NET для аутентификации с другого сайта (php) через OpenID - PullRequest
0 голосов
/ 08 мая 2011

Мне нужно реализовать следующую аутентификацию на моем asp.net: пользователь на сайтах ASP.NET и PHP должен проходить аутентификацию с использованием OpenID. Логин и регистрация существует только на сайте PHP. ТАК требования:

  • Мой сайт ASP.NET должен перенаправить на сайт PHP для аутентификации. Пользователь будет аутентифицируется с использованием OpenID с сайта PHP.
  • Если пользователь новый (я планирую использовать куки) на мой сайт ASP.NET, он будет перенаправлять с пустым В параметре. В противном случае я передаю сохраненный OpenID в запросе на перенаправление.
  • Веб-сайт PHP показывает пользователю страницу входа в систему, если переданный OpenID пуст, и позволяет пользователю проходить аутентификацию и регистрироваться. Если переданный OpenID не пуст. веб-сайт PHP должен проверить его действительное состояние.
  • Только если аутентификация / регистрация прошла успешно, сайт PHP перенаправляет обратно на мой сайт ASP.NET OpenID, который я буду использовать для пользователя.
  • Этот процесс, конечно, должен быть безопасным.

Я обнаружил, что проверка подлинности должна быть реализована в Global.asax в событии Application_AuthenticateRequest с использованием FormAuthentication. Я планирую это так

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
  if(HttpContext.Current.User != null) {
    // Extract the forms authentication cookie if exists.

    // Redirects to the php website using the OpenID extracted from the cookies, or empty.
    // Pass also a new generated token to secure the communication.

  } else {
    // Store a new GeneralPrincipal to the HttpContext.Current.User.
  }
}

protected void Application_BeginRequest(Object sender, EventArgs e) {
  // Check for the redirected back token and OpenID.

  // Create FormsAuthenticationTicket for the openid and store it in the cookie.
}

Проблема в том, что я не могу сохранить сгенерированный токен в Session, потому что SessionState не инициализируется в то время.

Какова наилучшая практика для решения вышеуказанных требований?

1 Ответ

0 голосов
/ 29 марта 2012

Я решил проблему, используя базовый класс страниц для всех моих сайтов, которые должны быть защищены.Пользователь будет проверяться в OnInit при каждом запросе, подобном этому

protected override void OnInit(EventArgs e) {
// Check Identity.
if(HttpContext.Current.User.Identity.IsAuthenticated) {
  // The user is already authenticated.
  // Get the user...
  return;    
}
// Check if the php server sends request with token.
if(!string.IsNullOrEmpty(Request.QueryString["token"])) {
  try {
    // Get user from the PHP-Server by the token.
    //...
    // Remove old FormsAuthentication.
    FormsAuthentication.SignOut();
    // Save new authentication.
    SaveAuthentication();
  } catch(Exception exception) {
    // Handle...
    return;
  }
} else {
   // Get new php-token and redirect to the php-server for the authentication.
   //...
}

Для локализуемых веб-сайтов ASP.NET это может быть реализовано методом InitializeCulture.

...