using System; using System.Web; using System.Web.Security; using DotNetOpenAuth.AspNet; using Microsoft.AspNet.Membership.OpenAuth; namespace WebSRM.Account { public partial class RegisterExternalLogin : System.Web.UI.Page { protected string ProviderName { get { return (string)ViewState["ProviderName"] ?? String.Empty; } private set { ViewState["ProviderName"] = value; } } protected string ProviderDisplayName { get { return (string)ViewState["ProviderDisplayName"] ?? String.Empty; } private set { ViewState["ProviderDisplayName"] = value; } } protected string ProviderUserId { get { return (string)ViewState["ProviderUserId"] ?? String.Empty; } private set { ViewState["ProviderUserId"] = value; } } protected string ProviderUserName { get { return (string)ViewState["ProviderUserName"] ?? String.Empty; } private set { ViewState["ProviderUserName"] = value; } } protected void Page_Load() { if (!IsPostBack) { ProcessProviderResult(); } } protected void logIn_Click(object sender, EventArgs e) { CreateAndLoginUser(); } protected void cancel_Click(object sender, EventArgs e) { RedirectToReturnUrl(); } private void ProcessProviderResult() { // 处理请求中的身份验证提供程序返回的结果 ProviderName = OpenAuth.GetProviderNameFromCurrentRequest(); if (String.IsNullOrEmpty(ProviderName)) { Response.Redirect(FormsAuthentication.LoginUrl); } // 生成重定向 URL 以进行 OpenAuth 验证 var redirectUrl = "~/Account/RegisterExternalLogin"; var returnUrl = Request.QueryString["ReturnUrl"]; if (!String.IsNullOrEmpty(returnUrl)) { redirectUrl += "?ReturnUrl=" + HttpUtility.UrlEncode(returnUrl); } // 验证 OpenAuth 负载 var authResult = OpenAuth.VerifyAuthentication(redirectUrl); ProviderDisplayName = OpenAuth.GetProviderDisplayName(ProviderName); if (!authResult.IsSuccessful) { Title = "外部登录失败"; userNameForm.Visible = false; providerMessage.Text = String.Format("外部登录 {0} 失败,", ProviderDisplayName); // 若要查看此错误,请在 web.config 中启用页跟踪(),然后访问 ~/Trace.axd Trace.Warn("OpenAuth", String.Format("使用 {0}) 验证身份验证时出错", ProviderDisplayName), authResult.Error); return; } // 用户已成功地使用提供程序登录 // 检查用户是否已在本地注册 if (OpenAuth.Login(authResult.Provider, authResult.ProviderUserId, createPersistentCookie: false)) { RedirectToReturnUrl(); } // 在 ViewState 中存储提供程序详细信息 ProviderName = authResult.Provider; ProviderUserId = authResult.ProviderUserId; ProviderUserName = authResult.UserName; // 从操作中去除查询字符串 Form.Action = ResolveUrl(redirectUrl); if (User.Identity.IsAuthenticated) { // 用户已进行身份验证,请添加外部登录并重定向到返回 URL OpenAuth.AddAccountToExistingUser(ProviderName, ProviderUserId, ProviderUserName, User.Identity.Name); RedirectToReturnUrl(); } else { // 这是新用户,请要求该用户提供所需的成员名称 userName.Text = authResult.UserName; } } private void CreateAndLoginUser() { if (!IsValid) { return; } var createResult = OpenAuth.CreateUser(ProviderName, ProviderUserId, ProviderUserName, userName.Text); if (!createResult.IsSuccessful) { userNameMessage.Text = createResult.ErrorMessage; } else { // 已成功创建并关联用户 if (OpenAuth.Login(ProviderName, ProviderUserId, createPersistentCookie: false)) { RedirectToReturnUrl(); } } } private void RedirectToReturnUrl() { var returnUrl = Request.QueryString["ReturnUrl"]; if (!String.IsNullOrEmpty(returnUrl) && OpenAuth.IsLocalUrl(returnUrl)) { Response.Redirect(returnUrl); } else { Response.Redirect("~/"); } } } }