c# - Rails 和 ASP.NET 单点登录

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

我有一个 ASP.NET 应用程序,它使用表单例份验证,并将凭据存储在一个表中 - 非常普通。因为我知道密码是如何散列的,我能以某种方式与 Rails 共享表单例份验证 cookie,从而有效地创建单点登录吗?这两个 Web 应用程序将位于同一个域中。

最佳答案

您可以与 Rails 共享 ASP.NET Forms Auth Cookie,但您必须在 Rails 端对其进行解密。可能是太麻烦了。

一个更简单的解决方案是跳过 .NET Forms Authentication Ticket 并在两侧保留您自己的 auth ticket (cookie),使用您想要的加密算法和两个平台之间的相同 salt。盐可以保存在数据库或物理文件中,如果它们位于同一磁盘上。

一个例子:

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。双方使用相同的名称。

利润。

关于c# - Rails 和 ASP.NET 单点登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4210653/

相关文章:

c# - sql server 中百分比列的数据类型是什么?

c# - 网络农场中的分布式关键部分

ruby-on-rails - 列出关联模型的名称

ruby-on-rails - 我的脚本会发送很多请求吗?

c# - 防止 CodeDom 拆分大字符串

c# - 如何使用 IKVM 构建 .net 库?

c# - ExcelPackage 和 98000 行

asp.net - Web API 中的 [FromRoute] 和 [FromBody] 有什么区别?

ruby-on-rails - 用于下载 youtube 视频的 Rails 应用程序

c# - csc.exe 和相互依赖的程序集