前言( 引用 Lee's 程序人生- 博客园-OpenID使用手册JAVA版 )
了解一下openIDopenID在中国还不怎么普及,而且支持openID登录的站点也比较少 ,不过还是先补充点openID的信息吧 啥是openID呢,所谓openID就是用一个URL作为登录帐号和密码的验证 再详细一点就是,不用注册,也不用输入密码,只要你拥有一个openID就可以登录网站了 可能这样说有点难以理解,接下来我们稍微深一点的去理解 假设你现在已经从一个可以申请openID的网站上申请了一个openID,链接是”rjys.163.com” {openID是一个URL链接,不是一个以前的字母或者字母+数字哦} 什么是OpenID? <link rel="openid.server" href="http://openid.example.com/"> 保存这些link元数据的最常见位置就是个人站点(比如博客)的根页面。 |
在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.测试. |