如何在ASP.NET中创建OpenID

前言( 引用 Lee's 程序人生- 博客园-OpenID使用手册JAVA版

 

了解一下openID

openID在中国还不怎么普及,而且支持openID登录的站点也比较少

,不过还是先补充点openID的信息吧

啥是openID呢,所谓openID就是用一个URL作为登录帐号和密码的验证

再详细一点就是,不用注册,也不用输入密码,只要你拥有一个openID就可以登录网站了

可能这样说有点难以理解,接下来我们稍微深一点的去理解

假设你现在已经从一个可以申请openID的网站上申请了一个openID,链接是”rjys.163.com”

{openID是一个URL链接,不是一个以前的字母或者字母+数字哦}

什么是OpenID?
OpenID是一种开放、离散式的用于用户数字标识的开源框架。
请让我们思考自己所拥有的在线帐号种类:博客、wiki、to-do list、个人相册。在网络应用日益充斥的今天,这些个人在线帐号可谓不胜枚举,而对帐号的需要也同样无处不在,乃至当我们想在好友博客上进行评论时都需要注册成为该博客系统的用户。于是作为终端用户,我们不得不在每个网站上设置帐号,并管理众多的帐号。而采用OpenID技术的话,你就无须再管理这些相互独立的帐号,而是通过认证服务器管理自己唯一的身份标识。
OpenID常见的应用场景:某用户试图登录一个外部网站。与提交用户名和密码的方式不同,他只提交了属于自己的一个URL,例如:http://johnsmith.example.com/
这个URL即指向了用户的OpenID认证服务器,同时又是用户的身份标识。因此外部网站使用此URL便可以找到用户的认证服务器,并询问认证服务器:“该用户声称他拥有此URL。而这个URL说明了你负责认证工作,那么请告诉我,该用户能否访问我的站点?”。认证服务器将提示用户登入认证系统,并询问用户是否允许和外部网站进行认证。如果用户同意的话,那么认证服务器将通知外部网站——用户已经通过认证。在上面,我们通过拟人化的表达方式来形象生动地诠释整个认证请求/回应过程。
用户可以使用同一个URL用作在任何支持OpenID认证的外部网站中使用的标识。这正是OpenID与其它传统认证方式的最大不同。通过使用URL,可以使外部站点非常容易地获取到负责认证工作的服务器位置。而只有认证服务器才需要输入密码来验证用户身份。其它希望验证用户身份的站点都将询问用户所注册的认证服务器。如果你正在使用支持OpenID的门户站点(比如AOL),那么你就可以使用现成的AOL即时消息登录帐号来登录AOL站点,而无需另外注册。因此,我们可以猜想Google和Yahoo也许已经开始着手建造他们的OpenID服务。
你一定想知道OpenID是如何实现分散化服务的?由于用户具有选择OpenID服务提供者的权利,因此你会在最初选择AOL作为OpenID提供者,而过一段时间后,可能觉得希望更换到另外一个OpenID提供者,此时你所需要做的就是修改以下的HTML标签:

<link rel="openid.server" href="http://openid.example.com/">

保存这些link元数据的最常见位置就是个人站点(比如博客)的根页面。
如何使用OpenID?
OpenID 绝妙地解决了多个帐号同步问题,但并不仅仅如此。例如,你可以利用它建立跨应用、跨域的单点登录(Single sign-on)。如果你使用同一个OpenID登入了博客和个人相册,那么你只需要在登录过程中进行一次认证。对于在此之后的每个需要登录的应用(在同一个session周期)只需提供OpenID,而不是传统的用户名和密码。
大多数OpenID提供者也提供了支持多个配置的功能。这样你就可以使用“Bob Smith”登录博客,而使用“Robert J Smith”登录企业wiki。随着OpenID提供者的日益成熟和OpenID功能上的提升,我们不久就会使用对来自伙伴公司OpenID认证服务器主机名的用户进行认证的服务。
哪些网站支持OpenID?
OpenID技术出现不久,便获得了在众多公共消费站点的热捧:DiggSix ApartZoomrAOL。其中AOL为老用户提供了OpenID支持,使得六千五百万的登录用户在一日之内就全部能够使用OpenID。目前已经具有超过九千五百万的用户能够使用 OpenID登录系统,并且每天都有25至50个站点加入到支持OpenID规范的队伍中。另外,OpenID增加了对Firefox3和微软 Windows Vista的支持。
下面是实现了OpenID代码库的语言列表:
        • C#
        • C++
        • Java
        • Perl
        • Python
        • Ruby
        • PHP
        • Coldfusion
OpenID社区维护了这些代码库的清单:http://openid.net/wiki/index.php/Libraries

 

在ASP.NET中实现OpenID登录

  注册一个OPENID帐号,这里使用http://www.myopenid.com
  1.从谷歌CODE上下载强大的C# OpenID库DotNetOpenId,并把它应用到你的项目中。
 
  2.在OpenID登录时添加了一些不错的可用性功能,这是可选的,下图为格式化了的OpenID框,请转到:ID Selector
  3.转到Scott Hanselman's的示例帖子。你将很好的了解如何新增的OpenID到ASP.NET的网站。
  4.创建登录表单,这里用用户控件。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OpenIdLoginForm.ascx.cs"
    Inherits="OpenIDSampleApp.Web.UserControls.OpenIdLoginForm" %>
OpenID:
<asp:TextBox ID="openid_identifier" runat="server" />
<asp:Button ID="loginButton" runat="server" Text="登录" OnClick="loginButton_Click" />
<!-- BEGIN ID SELECTOR -->

<script type="text/javascript">
  <!--
    idselector_input_id = "<%= openid_identifier.ClientID %>";
    -->
</script>

<script type="text/javascript" id="Script1" 
    src="https://www.idselector.com/selector/acd9fbc926f4707be4d6a05b400fe40de1f31449"
    charset="utf-8"></script>

<!-- END ID SELECTOR -->
<br />
<asp:CheckBox ID="chkRememberMe" runat="server" Text="记住我." />
<asp:CustomValidator
    runat="server"
    ID="openidValidator"
    ErrorMessage="OpenID格式无效"
    ControlToValidate="openid_identifier"
    EnableViewState="false"
    OnServerValidate="openidValidator_ServerValidate" />
<asp:Label ID="loginFailedLabel" runat="server" EnableViewState="False" Text="登录失败"
    Visible="False" />
<asp:Label ID="loginCanceledLabel" runat="server" EnableViewState="False" Text="登录取消"
    Visible="False" />
  5.登录按钮下的代码,Scott Hanselman's提供,基本上告诉的OpenID库需要用户的电子邮件和昵称。
        protected void loginButton_Click ( object sender, EventArgs e ) {
            if ( !openidValidator.IsValid )
                return; // 如果自定义验证失败,将不会登录。
            OpenIdRelyingParty openid = new OpenIdRelyingParty ();
            try {
                IAuthenticationRequest request = openid.CreateRequest ( openid_identifier.Text );
                // 请将您的访客给供应商进行验证。
                ClaimsRequest fetch = new ClaimsRequest ();
                fetch.Nickname = DemandLevel.Require;
                fetch.Email = DemandLevel.Require;
                request.AddExtension ( fetch );
                //SaveCookies (); //在网站上保存身份票
                request.RedirectToProvider ();
            }
            catch ( OpenIdException ex ) {
                // 可能不是一个有效的OpenID。
                openidValidator.Text = ex.Message;
                openidValidator.IsValid = false;
            }
        }
  6.处理OpenID库的答复,当然你也可以让用户选择是否用OPENID创建一个帐户,或者直接看看是否用户已经存在与网站上的ASP.NET成员数据库。
如果不存在可以为OPEN用户创建一个成员帐户使用OpenID作为他们的用户名。
  protected void Page_Load ( object sender, EventArgs e ) {
            openid_identifier.Focus ();
            OpenIdRelyingParty openid = new OpenIdRelyingParty ();
            if ( openid.Response != null ) {
                switch ( openid.Response.Status ) {
                    case AuthenticationStatus.Authenticated:

                        // 下面2个变量只是为了作为后面的添加网站用户表字段的值,
                        // 也就是创建Membership[web.config]时才用到
                        string email = "";
                        string alias = "";

                        ClaimsResponse fetch = openid.Response.GetExtension ( 
                              typeof ( ClaimsResponse ) ) as ClaimsResponse;
                        if ( fetch != null ) {
                            alias = fetch.Nickname;
                            email = fetch.Email;
                        }

                        if ( string.IsNullOrEmpty ( alias ) )
                            alias = openid.Response.ClaimedIdentifier;
                        if ( string.IsNullOrEmpty ( email ) )
                            email = openid.Response.ClaimedIdentifier;

                        //#region Membership[web.config]
                        // 是否在网站上添加OPEN用户 
                        //if (Membership.GetUser(openid.Response.ClaimedIdentifier) == null)
                        //{
                        //    MembershipCreateStatus membershipCreateStatus;
                        //    MembershipUser user = Membership.CreateUser(
                        //        openid.Response.ClaimedIdentifier, 
                        //        "123456", 
                        //        email, 
                        //        "这是一个的OpenID帐户。昵称是什么?", 
                        //        alias, 
                        //        true, 
                        //        out membershipCreateStatus );
                        //    if (membershipCreateStatus != MembershipCreateStatus.Success) {
                        //        loginFailedLabel.Text += ": 帐户添加不成功的: " +
                        //                                 membershipCreateStatus.ToString();
                        //        loginFailedLabel.Visible = true;
                        //        break;
                        //    }
                        //    user.Comment = alias;
                        //    Membership.UpdateUser(user);
                        //}

                        // 使用FormsAuthentication告诉ASP.NET,用户现在已经登录成功, 
                        // 并使用OpenID标识作为用户名 
                        //#endregion

                        FormsAuthentication.RedirectFromLoginPage ( 
                            openid.Response.ClaimedIdentifier, chkRememberMe.Checked );
                        break;
                    case AuthenticationStatus.Canceled:
                        loginCanceledLabel.Visible = true;
                        break;
                    case AuthenticationStatus.Failed:
                        loginFailedLabel.Visible = true;
                        break;
                }
            }
        }
  7.测试.


补充:Scott Hanselman's Blog

          http://www.codeplex.com/dasblog

          示例代码下载

posted @ 2008-10-11 22:44 真见 阅读(...) 评论(...) 编辑 收藏