ASP.NET和MVC.NET解决方案之间单点登录的选项?

时间:2013-03-15 15:29:02

标签: c# asp.net asp.net-mvc security authentication

我有一个ASP.NET解决方案,可以作为客户的主要客户门户。在该网站上,用户可以登录访问其重要的财务信息等。该网站使用自定义身份验证方案,该方案针对本地数据库中的Users表检查用户的用户名(他们的电子邮件)和密码(salt-hashed)。

我正在构建一个新的MVC.NET解决方案,它更像是一个Web应用工具,供这些客户用于订购。我想重新使用ASP.NET门户的登录机制来验证用户身份。目标是避免用户记住两次登录,甚至不必提供两次相同的登录。

允许登录ASP.NET解决方案的用户然后对MVC.NET解决方案进行自动身份验证有哪些选择?我在下面列出了一些想法,但这些是“坏”还是有更优雅的解决方案?我很喜欢你的意见。

  • 通用Cookie 我可以创建ASP.NET网站创建的公共cookie以及MVC.NET网站查找的公共cookie。但这足够安全吗?
  • 查询字符串中的令牌我可以在ASP.NET站点上创建一个存储在本地数据库中的令牌ID,然后将其传递到MVC.NET站点的链接的查询字符串中获取令牌ID并对同一数据库验证它。
  • 混合两者兼而有之?
  • 其他?有更好的主意吗?

4 个答案:

答案 0 :(得分:3)

我最近使用OpenId做了一些非常相似的事情(主要区别在于公司内部而不是外部客户)。

OpenId for .NET的实现称为DotNetOpenAuth,它应该适用于您的目的。

我确实需要一段时间来实施;但它运作良好,非常灵活,非常安全。

有关openid的更多信息(来自Wikipedia):

  

OpenID是一种开放标准,允许用户通过某些合作网站(称为依赖方或RP)使用第三方服务进行身份验证,从而无需网站管理员提供自己的临时系统并允许用户巩固他们的数字身份。

     

用户可以使用其首选的OpenID身份提供商创建帐户,然后使用这些帐户作为登录任何接受OpenID身份验证的网站的基础。 OpenID标准为身份提供者和OpenID接受者("依赖方")之间的通信提供了一个框架。2标准的扩展(OpenID属性交换)有助于将用户属性(例如名称和性别)从OpenID身份提供者转移到依赖方(每个依赖方可以根据其要求请求不同的属性集)。

     

OpenID协议不依赖于中央权限来验证用户的身份。 此外,服务和OpenID标准都不能强制要求用户认证的具体方法,允许从常见(如密码)到新颖(如智能卡或生物识别)的方法。

哦,如果您想进一步鼓励,Stack Exchange会使用它!

@Jmrnet:回复你的上一条评论:

也许我不清楚。 OpenId本身就是用于验证从一个位置到另一个位置(或多或少)的凭证。完全可以实现作为SSO模型,用户不会做任何不同的事情 - 他们不必选择提供商,注册或类似的东西。例如,在我的设置中,用户在Web门户中输入用户名和密码,然后单击按钮以启动另一个由OpenId自动登录的站点。对用户来说没有什么不同! OpenId可以与您能想到的任何初始身份验证模型一起使用(请注意维基百科的代码段中的粗体部分)。

答案 1 :(得分:2)

看看SAML:

http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language

它使用XML并支持加密。

答案 2 :(得分:0)

我目前正在为同一个项目实施两个SSO解决方案。

在一个方面,我们正在与外部合作伙伴进行接口,并正在使用SAML。

另一方面,我们允许登录用户访问我们的Sharepoint并使用查询字符串中的"令牌"方法,因为我们信任Sharepoint访问我们的会员表。这种方法比处理SAML令牌容易得多。

答案 3 :(得分:0)

您可以使用许多方法,Mansfied描述了OpenID和RandomUs1r描述的SAML。此外,您可以在localStorage或会话中存储相关信息。我相信你应该在会话中存储相关信息。

将它放在查询字符串中是不安全的,因为如果我注册并登录,我会在URL中看到类似UserID = 1234的内容。如果我将其更改为UserID = 1235并且ID已存在,那么我可以用其他用户的名义做一些事情。这称为身份盗窃,应以任何可能的方式予以阻止。因此,您的网址中绝不应该包含此类信息。此外,如果您存储用户的ID,您应该以某种方式对其进行模糊处理。例如,如果您将值存储在本地存储中而不是1234存储加密(1234,盐),则将保持用户操作的一致性。