【问题标题】:Use mixed authentication with Asp.Net MVC (Forms, FB connect, twitter, openId)使用 Asp.Net MVC 的混合身份验证(Forms、FB connect、twitter、openId)
【发布时间】:2010-09-11 00:37:35
【问题描述】:

我正在创建一个新站点,我希望用户能够使用多种方式登录,基本上用户应该能够在我的站点上创建新用户或使用 Facebook 连接或使用 Twitter 的帐户登录进入网站。

我看过一些关于使用其中一种方法的教程,我想知道的是,您认为最好的方法是什么?

到目前为止,我认为最好的方法是创建自定义身份验证模型(类似于对现有授权类进行子类型化)。

这是最好的方法吗? 你能给我举一个很好的例子吗?

非常感谢

【问题讨论】:

    标签: asp.net-mvc authentication login facebook


    【解决方案1】:

    我最近在博客上写过类似的东西...这是我采用的方法

    public class User {
        public int UserID { get; set; }
        public string Name { get; set; }
        public string Page { get; set; }
    
        public virtual Authentication Authentication { get; set; }
    }
    
    public class Authentication {
        public int Id { get; set; }
        public string LoginId { get; set; }
        public string Provider { get; set; }
        public string Password { get; set; }
    
        public virtual User User { get; set; }
    }
    
    //login methods
    User StandardUserLogin(string username) {
        IDataContext db = new DataContext();
        var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username);
        if (user != null) {
            if (user.Authentication.Password == password) {
                SetAuthenticationTicket(user);
                return user;
            }
        }
    }
    

    我会根据授权方案的工作方式为每种类型的登录创建不同的登录方法。

    User OpenIdUserLogin(string username) {
        IDataContext db = new DataContext();
        var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username && u.Authentication.Provider == "openid");
        if (user == null) {
            //create new openid user
        }
    
        if (user.Authentication.LoginId == id) {
            SetAuthenticationTicket(user);
            return user;
            }
    }
    
    //openid's authentication method
    [ValidateInput(false)]
    public ActionResult Authenticate(string returnUrl) {
        IAuthenticationResponse response = OpenId.GetResponse();
    
        if (response == null) {
            //make openid request here
        } else {
            var user = OpenIdUserLogin(response.ClaimedIdentifier);
        }
    }
    

    顺便说一句,顶部的两个类代表我的实体框架 POCO 这里的关键是与用户表分开的身份验证表。它允许一个用户使用多种登录方法。希望这可以帮助您走上正轨。

    【讨论】:

    • 快速提问;这些方法适用于 OpenID,而不是 Twitter 使用的 Open Authentication。无论是 OpenID 还是 Open Auth,我们都可以执行相同的程序吗?
    • 是的,它的 POCO 类相当通用。您可能需要添加一两个字段,但鉴于我对 twitter 的有限经验,我怀疑它只需要存储他们的身份验证令牌,该令牌将存储在字段 LoginId 中。然后,您只需对不同的登录类型调用不同的方法。因此,您可以调用 Twitter,而不是 OpenIdUserLogin。如果我不太忙,如果您遇到问题,我会在我的博客中添加一篇关于它的新帖子 :)
    • 感谢您的回复。我以与您在此处回答的非常相似的方式实现了 OpenID 登录,现在我将使用 oAuth。我目前正在关注这两个链接:bit.ly/csBrgMbit.ly/i8GwDh 尚未测试,所以它可能会非常好,也可能非常糟糕,但再次感谢您的回复:)
    【解决方案2】:

    如果您愿意每月花几块钱,Windows Azure Access Control Service 提供此功能作为 ASP.NET 的插入式会员提供程序。这也是新的 Windows 8 SSO 凭据流的基础。

    但请注意,Twitter 尚不受支持,因为访问控制不支持 OAuth 1.0。

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2011-01-26
      相关资源
      最近更新 更多