public async Task <ActionResult> QQLogin(NewUserViewModel viewModel) { var owinContext = Request.GetOwinContext(); var identity = await owinContext.Environment.GetIdentityServerPartialLoginAsync(); if (identity == null || identity.IsAuthenticated == false) { return(new HttpUnauthorizedResult()); } var qqConnectProfile = new QQConnectProfile(identity.Claims); var newUser = new InMemoryUser { Username = viewModel.UserName ?? "Default Name", Subject = Guid.NewGuid().ToString(), Enabled = true, Provider = qqConnectProfile.Issuer, ProviderId = qqConnectProfile.OpenId, Claims = new[] { new Claim(Constants.ClaimTypes.NickName, qqConnectProfile.NickName), new Claim(Constants.ClaimTypes.Picture, qqConnectProfile.Avatar), } }; Users.All.Add(newUser); var resumeUrl = await owinContext.Environment.GetPartialLoginResumeUrlAsync(); return(Redirect(resumeUrl)); }
protected override async Task <HandleRequestResult> HandleRemoteAuthenticateAsync() { try { var code = Request.Query["code"].ToString(); var state = Request.Query["state"].ToString(); if (code == null) { return(HandleRequestResult.Fail("Code was not found.")); } var properties = Options.StateDataFormat.Unprotect(state); if (properties == null) { return(HandleRequestResult.Fail("The oauth state was missing or invalid.")); } if (ValidateCorrelationId(properties) == false) { return(HandleRequestResult.Fail("Correlation failed.")); } var token = await InnerClient.GetTokenAsync( code, Context.RequestAborted); if (string.IsNullOrWhiteSpace(token.AccessToken)) { return(HandleRequestResult.Fail("OAuth token endpoint failure.")); } var openId = await InnerClient.GetOpenIdAsync( token.AccessToken, Context.RequestAborted); if (string.IsNullOrWhiteSpace(openId.OpenId)) { return(HandleRequestResult.Fail("openid was not found.")); } var user = await InnerClient.GetUserAsync( token.AccessToken, openId.OpenId, Context.RequestAborted); var qqConnectProfile = QQConnectProfile.From(Scheme.Name, token, openId, user); var principal = qqConnectProfile.BuildClaimsPrincipal(); var ticket = new AuthenticationTicket(principal, properties, Scheme.Name); return(HandleRequestResult.Success(ticket)); } catch (Exception ex) { return(HandleRequestResult.Fail(ex)); } }
public async Task <ActionResult> QQLogin() { var owinContext = Request.GetOwinContext(); var identity = await owinContext.Environment.GetIdentityServerPartialLoginAsync(); if (identity == null || identity.IsAuthenticated == false) { return(new HttpUnauthorizedResult()); } var qqConnectProfile = new QQConnectProfile(identity.Claims); return(View(new NewUserViewModel { UserName = qqConnectProfile.NickName, AvatarUrl = qqConnectProfile.Avatar })); }
protected override async Task <AuthenticationTicket> AuthenticateCoreAsync() { AuthenticationProperties properties = null; try { var code = Request.Query.Get("code"); var state = Request.Query.Get("state"); properties = Options.StateDataFormat.Unprotect(state); if (properties == null) { return(null); } if (!ValidateCorrelationId(properties, _logger)) { return(new AuthenticationTicket(null, properties)); } if (code == null) { return(new AuthenticationTicket(null, properties)); } var token = await InnerHandler.GetTokenAsync( code, Request.CallCancelled); if (string.IsNullOrWhiteSpace(token.AccessToken)) { _logger.WriteError("access_token was not found"); return(new AuthenticationTicket(null, properties)); } var openId = await InnerHandler.GetOpenIdAsync( token.AccessToken, Request.CallCancelled); if (string.IsNullOrWhiteSpace(openId.OpenId)) { _logger.WriteError("openid was not found"); return(new AuthenticationTicket(null, properties)); } var user = await InnerHandler.GetUserAsync( token.AccessToken, openId.OpenId, Request.CallCancelled); var identity = QQConnectProfile.BuildClaimsIdentity(Options.AuthenticationType, token, openId, user); return(new AuthenticationTicket(identity, properties)); } catch (Exception ex) { _logger.WriteError("Authentication failed", ex); return(new AuthenticationTicket(null, properties)); } }