Rails и ASP.NET с единым входом - PullRequest
4 голосов
/ 18 ноября 2010

У меня есть приложение ASP.NET, которое использует аутентификацию форм и хранит учетные данные в таблице - довольно ванильно.Так как я знаю, как хэшируется пароль, могу ли я каким-то образом делиться cookie авторизации форм с Rails, эффективно создавая единый вход?Оба веб-приложения будут находиться в одном домене.

Ответы [ 2 ]

7 голосов
/ 18 ноября 2010

Вы можете поделиться файлом cookie аутентификации ASP.NET Forms с Rails, но вам придется расшифровать его на стороне Rails.Возможно, это слишком много проблем.

Более простое решение - пропустить билет аутентификации .NET Forms и сохранить свой собственный билет авторизации (cookie) с обеих сторон, используя нужный алгоритм шифрования ита же соль среди двух платформ.Соль может быть сохранена в базе данных или физическом файле, если они находятся на одном диске.

Пример:

C # сторона:

public class MyTicket {
  ...
  public string ToSerializableFormat() {
    return String.Format("{0}|{1}", t.Username, t.somethingElseYouNeed);
  }

  public static MyTicket Parse(string value) {
    var vals = value.Split('|');
    return MyTicket(values[0], values[1]);
  }
}

Где-то ещев вашем приложении, заменив вызовы FormsAuthentication.Encrypt и FormsAuthentication.Decrypt:

string MakeTicket(MyTicket t) {
  return EncryptSomehow(key, t.ToSerializableFormat());
}

MyTicket ReadTicket(string cookieValue) {
  return MyTicket.Parse( DecryptSomehow(key, cookieValue) );
}

И Ruby-эквивалент будет:

class MyTicket
  def to_serializable_format
    "#{@username}|#{@something_else}"
  end

  def self.parse(value)
    values = value.split '|'
    MyTicket.new(*values)
  end
end

Где-то в вашем коде Rails вы будете расшифровыватьи зашифровать файл cookie аутентификации.Используйте одинаковое имя с обеих сторон.

Прибыль.

0 голосов
/ 18 ноября 2010

Я не знаю о совместном использовании файла cookie для аутентификации - это, вероятно, будет сложно.Но поделиться информацией об идентичности было бы довольно просто.

Я написал бы пользовательскую модель в Rails, которая действует как адаптер к существующей таблице идентификаторов, используя трюк establish_connection:

class User < ActiveRecord::Base
  establish_connection(
    { :adapter => "mysql", 
      :database => "db_name", 
      :host => "db.example.com",
      :username => "user",
      :password => "password" })
end

это заставит модель User подключаться к другой базе данных.В случае, если лучше, вы можете добавить еще одну запись в database.yml и загрузить ее здесь.

Тогда вам просто потребуется перегрузить функции доступа для работы с нестандартной схемой.

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