Rails和ASP.NET单点登录

时间:2010-11-18 00:45:24

标签: c# asp.net ruby-on-rails ruby authentication

我有一个使用表单身份验证的ASP.NET应用程序,并将凭据存储在表中 - 非常香草。由于我知道如何对密码进行哈希处理,我可以以某种方式与Rails共享表单auth cookie,从而有效地创建单点登录吗?这两个网络应用都将位于同一个域中。

2 个答案:

答案 0 :(得分:7)

您可以与Rails共享ASP.NET Forms Auth Cookie,但您必须在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.EncryptFormsAuthentication.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。两边都使用相同的名称。

利润。

答案 1 :(得分:0)

我不知道共享auth cookie - 这可能很难。但共享身份信息非常简单。

我会在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中添加另一个条目并在此处加载。

然后,您只需要重载访问器函数来处理非标准模式。