2010-11-18 2 views
4

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

ответ

0

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

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

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

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

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

7

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

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

Пример:

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)); 
} 

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

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

У меня создалось впечатление, что это больше работы, чем того стоит. Это то решение, на котором я бы сосредоточился. – jocull

+0

Это в значительной степени то, что я получаю. У меня есть алгоритм хэширования паролей, реализованный как в C#, так и в Ruby. Как бы я расшифровывал файлы cookie ASP.NET с помощью cookie в Rails? Мне нужно избегать входа в систему дважды - отсюда «одиночный» вход ;-) –

+0

Вы можете попробовать запустить Reflector (http://www.red-gate.com/products/reflector/) в разделе «FormsAuthentication» .Decrypt', чтобы увидеть, как это делает .NET. Но мое предложение состоит в том, чтобы пропустить Билет Форм-Аута вообще и написать свой собственный «билет», который вы знаете, как расшифровать с обеих сторон. Я отредактировал ответ, чтобы дать понять. –

Смежные вопросы