我有一个使用表单身份验证的ASP.NET应用程序,并将凭据存储在表中 - 非常香草。由于我知道如何对密码进行哈希处理,我可以以某种方式与Rails共享表单auth cookie,从而有效地创建单点登录吗?这两个网络应用都将位于同一个域中。
答案 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.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。两边都使用相同的名称。
利润。
答案 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
中添加另一个条目并在此处加载。
然后,您只需要重载访问器函数来处理非标准模式。