public void Login() { response = new OpenIdRelyingParty().GetResponse(); if (response == null) { var request = new OpenIdRelyingParty().CreateRequest(Url); request.AddExtension ( new ClaimsRequest() { Email = DemandLevel.Require, Language = DemandLevel.Require, TimeZone = DemandLevel.Require, Country = DemandLevel.Require, BirthDate = DemandLevel.Require, PostalCode = DemandLevel.Require, Gender = DemandLevel.Require, Nickname = DemandLevel.Require, FullName = DemandLevel.Require } ); request.RedirectToProvider(); } else if (response != null && response.Status == AuthenticationStatus.Authenticated) { IsAuthenticated = true; //基本 var claimResponse = response.GetExtension<ClaimsResponse>(); User = new NTPCLibrary.User(); User.Identity = response.ClaimedIdentifier.ToString().Split('/').Last(); User.Departments = new List<Department>(); if (claimResponse != null) { User.ID = claimResponse.PostalCode; User.FullName = claimResponse.FullName; User.NickName = claimResponse.Nickname; User.Email = claimResponse.Email; User.Gender = claimResponse != null ? (claimResponse.Gender.Equals(Gender.Male) ? "男" : "女") : string.Empty; User.BirthDate = claimResponse.BirthDate; User.SchoolName = claimResponse.Country; User.ClassRoom = claimResponse.Language; User.Departments = JsonConvert.DeserializeObject<List<Department>>(claimResponse.TimeZone); } //延伸 FetchResponse fetchResponse = response.GetExtension<FetchResponse>(); User.AXExtension = fetchResponse != null ? GetAx(fetchResponse) : "無"; //寫入Cookie Util.SetCookie<User>(OPENID_COOKIE, User, CookieDomain, true); } }
private ActionResult HandleNullResponse(string url, string returnUrl) { Identifier id; if (Identifier.TryParse(url, out id) == false) ModelState.AddModelError("identifier", "The specified login identifier is invalid"); if (ModelState.IsValid == false) { if (Request.IsAjaxRequest()) return Json(new {Success = false, message = ModelState.GetFirstErrorMessage()}); TempData["Message"] = ModelState.GetFirstErrorMessage(); return Redirect(returnUrl); } try { var theReturnUrlForOpenId = new UriBuilder(Url.AbsoluteAction("Authenticate")) { Query = "returnUrl=" + Uri.EscapeUriString(returnUrl) }.Uri; var request = new OpenIdRelyingParty().CreateRequest(url, Realm.AutoDetect, theReturnUrlForOpenId); request.AddExtension(new FetchRequest // requires for Google { Attributes = { new AttributeRequest(WellKnownAttributes.Name.First, true), new AttributeRequest(WellKnownAttributes.Name.Last, true), new AttributeRequest(WellKnownAttributes.Contact.Email, true), new AttributeRequest(WellKnownAttributes.Contact.Web.Blog, true), new AttributeRequest(WellKnownAttributes.Contact.Web.Homepage, true), new AttributeRequest(WellKnownAttributes.Name.FullName, false), } }); request.AddExtension(new ClaimsRequest // other providers { Email = DemandLevel.Require, FullName = DemandLevel.Require, Nickname = DemandLevel.Require, }); return request.RedirectingResponse.AsActionResult(); } catch (ProtocolException ex) { if (Request.IsAjaxRequest()) return Json(new {message = ex.Message}); TempData["Message"] = ex.Message; return Redirect(returnUrl); } }