public async Task <bool> CheckDomain(PreAuthReq req)
        {
            var domainName = req.Email.Split('@')[1];
            var domain     = await GuestRequestRules.GetPreauthDomain(domainName);

            return(domain != null);
        }
コード例 #2
0
        public async Task <ActionResult> SignUp(GuestRequest request)
        {
            //sanity check: not trusting the passed-in preauth setting
            request.PreAuthed = (User.Identity.GetClaim(CustomClaimTypes.AuthType) == AuthTypes.B2EMulti);

            var result = await GuestRequestRules.SignUpAsync(request, Utils.GetProfileUrl(Request));

            return(View(result));
        }
コード例 #3
0
        private async Task <GraphInvitation> SendGraphInvitationAsync(GraphInvitation invitation, List <GroupObject> groups, string inviterResponseEmailAddr = null, InviteTemplate mailTemplate = null, string accessToken = null)
        {
            AdalResponse    serverResponse = null;
            GraphInvitation responseData   = new GraphInvitation();

            try
            {
                var inviteEndPoint = string.Format("{0}/{1}/invitations", Settings.GraphResource, Settings.GraphApiVersion);

                // Invite user. Your app needs to have User.ReadWrite.All or Directory.ReadWrite.All to invite
                serverResponse = AdalUtil.CallGraph(inviteEndPoint, invitation, false, null, _user, accessToken);
                responseData   = JsonConvert.DeserializeObject <GraphInvitation>(serverResponse.ResponseContent);
                if (responseData.id == null)
                {
                    responseData.ErrorInfo = string.Format("Error: Invite not sent - API error: {0}", serverResponse.Message);
                    return(responseData);
                }

                if (groups.Count > 0)
                {
                    var groupsAdded = AddUserToGroup(responseData.InvitedUser.Id, groups);
                    if (!groupsAdded.Success)
                    {
                        var resErrors = string.Join(", ", groupsAdded.Responses.Where(r => !r.Successful).Select(r => r.Message));
                        responseData.ErrorInfo += string.Format("\n\rOne or more groups failed while assigning to user \"{0}\" ({1})", responseData.InvitedUserEmailAddress, resErrors);
                    }
                }

                if (Settings.UseSMTP)
                {
                    mailTemplate = mailTemplate ?? Settings.CurrSiteConfig.InviteTemplateContent;

                    var emailSubject = mailTemplate.SubjectTemplate.Replace("{{InvitingOrgName}}", Settings.CurrSiteConfig.InvitingOrg);

                    string body = FormatEmailBody(responseData, inviterResponseEmailAddr, mailTemplate);
                    SendViaSMTP(emailSubject, body, invitation.InvitedUserEmailAddress);
                }


                var request = await GuestRequestRules.GetUserAsync(invitation.InvitedUserEmailAddress);

                request.InvitationResult = responseData;
                await GuestRequestRules.UpdateAsync(request);

                return(responseData);
            }
            catch (Exception ex)
            {
                var reason = (serverResponse == null ? "N/A" : serverResponse.ResponseContent);
                responseData.ErrorInfo = string.Format("Error: {0}<br>Server response: {1}", ex.Message, reason);
                return(responseData);
            }
        }
コード例 #4
0
        public async Task <ActionResult> SignUp(GuestRequest request)
        {
            var r = new RegexUtilities();

            if (!r.IsValidEmail(request.EmailAddress))
            {
                return(RedirectToAction("Index", "Home", new { area = "" }));
            }

            //sanity check: not trusting the passed-in preauth setting
            request.PreAuthed = (User.Identity.GetClaim(CustomClaimTypes.AuthType) == AuthTypes.B2EMulti);

            var result = await GuestRequestRules.SignUpAsync(request, Utils.GetProfileUrl(Request.Url));

            return(View(result));
        }
コード例 #5
0
        public async Task <ActionResult> Approve()
        {
            var approveCount = 0;
            var deniedCount  = 0;
            var sentCount    = 0;
            var requestList  = await GuestRequestRules.GetPendingRequestsAsync();

            foreach (var request in requestList)
            {
                var strDisposition = Request.Form[string.Format("Disposition.{0}", request.Id)];
                var disposition    = (Disposition)Enum.Parse(typeof(Disposition), strDisposition);
                switch (disposition)
                {
                case Disposition.Pending:
                    break;

                case Disposition.Approved:
                    approveCount++;
                    break;

                case Disposition.Denied:
                    deniedCount++;
                    break;
                }
                request.Disposition = disposition;

                request.InternalComment = Request.Form[string.Format("InternalComment.{0}", request.Id)];
                var domain = await GuestRequestRules.GetMatchedDomain(request.EmailAddress);

                var res = await GuestRequestRules.ExecuteDispositionAsync(request, User.Identity.Name, Utils.GetProfileUrl(Request.Url), domain);

                if (res != null && (res.InvitationResult.SendInvitationMessage || res.MailSent))
                {
                    sentCount++;
                }
            }

            requestList = await GuestRequestRules.GetPendingRequestsAsync();

            ViewBag.Message = string.Format("{0} {1} approved, {2} {3} denied, {4} {5} invitations sent.", approveCount, Utils.Pluralize(approveCount, "request"), deniedCount, Utils.Pluralize(deniedCount, "request"), sentCount, Utils.Pluralize(sentCount, "invitation"));
            return(View("Index", requestList));
        }
コード例 #6
0
        //private BulkInviteResults SubmitToGraphBatch(GraphBatch batch, BulkInviteSubmission submission)
        //{
        //    //** NOTE: this method was last tested against the beta API, circa Q3 CY17 **
        //    var res = new BulkInviteResults();
        //    var batchEndPoint = string.Format("{0}/beta/$batch", Settings.GraphResource);
        //    var serverResponse = CallGraph(batchEndPoint, batch, false, null, _userId);

        //    if (serverResponse.Successful)
        //    {
        //        res.InvitationResults = JsonConvert.DeserializeObject<GraphBatchResponse>(serverResponse.ResponseContent);
        //        if (submission.GroupList.Length > 0)
        //        {
        //            foreach (var item in res.InvitationResults.Responses)
        //            {
        //                var groupsAdded = AddUserToGroup(item.Body.InvitedUser.Id, submission.GroupList.ToList());
        //                if (!groupsAdded.Success)
        //                {
        //                    var resErrors = string.Join(", ", groupsAdded.Responses.Where(r => !r.Successful).Select(r => r.Message));
        //                    res.ErrorMessage += string.Format("\n\rOne or more groups failed while assigning to user \"{0}\" ({1})", item.Body.InvitedUserEmailAddress, resErrors);
        //                }
        //            }
        //        }
        //    }
        //    else
        //    {
        //        res.ErrorMessage = serverResponse.Message;
        //    }
        //    return res;
        //}

        private async Task <BulkInviteResults> SubmitLocally(GraphBatch batch, BulkInviteSubmission submission)
        {
            var res = new BulkInviteResults(submission.Id);

            GraphInvitation itemRes;
            var             mailTemplate = await TemplateUtilities.GetTemplate(submission.InviteTemplateId);

            try
            {
                foreach (var item in batch.Requests)
                {
                    itemRes = await SendGraphInvitationAsync(item.Body, submission.GroupList.ToList(), null, mailTemplate, _accessToken);

                    if (itemRes.Status != "Error")
                    {
                        submission.ItemsProcessed += 1;
                        submission = await BulkInviteSubmission.UpdateItem(submission);
                    }
                    item.Request.Status = itemRes.Status;
                    await GuestRequestRules.UpdateAsync(item.Request);

                    res.InvitationResults.Responses.Add(new BulkResponse
                    {
                        Status = itemRes.Status,
                        Body   = itemRes,
                        Id     = itemRes.id
                    });
                }

                await BulkInviteResults.AddItem(res);

                return(res);
            }
            catch (Exception ex)
            {
                res.ErrorMessage = ex.Message;
                await BulkInviteResults.AddItem(res);

                return(res);
            }
        }
コード例 #7
0
        public static async Task <bool> DeleteBatch(string submissionId)
        {
            var submission = await GetItem(submissionId);

            var requests = await GuestRequestRules.GetBatchRequest(submissionId);

            foreach (var request in requests)
            {
                await GuestRequestRules.DeleteAsync(request);
            }

            var results = await BulkInviteResults.GetItems(submissionId);

            foreach (var result in results)
            {
                await BulkInviteResults.DeleteItem(result);
            }

            await DeleteItem(submission);

            return(true);
        }
コード例 #8
0
        public async Task <IEnumerable <BulkInviteResults> > GetBatchProcessingHistory(string id)
        {
            IEnumerable <BulkInviteResults> history = (await GuestRequestRules.GetBatchSubmissionHistory(id));

            return(history);
        }
コード例 #9
0
        public async Task <IEnumerable <GuestRequest> > GetHistory([FromUri] HistoryFilter filter)
        {
            IEnumerable <GuestRequest> history = (await GuestRequestRules.GetHistory(filter)).OrderByDescending(h => h.RequestDate);

            return(history);
        }
コード例 #10
0
ファイル: InviteManager.cs プロジェクト: furena/bigcatAlpha
        /// <summary>
        /// GraphInvitation is a model from https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/resources/invitation
        /// Do not alter
        /// </summary>
        /// <param name="invitation">The GraphInvitation object transmitted to the B2B Guest API</param>
        /// <param name="groups">Azure AD groups to assign the guest user to</param>
        /// <param name="inviterResponseEmailAddr"></param>
        /// <param name="mailTemplate"></param>
        /// <param name="accessToken"></param>
        /// <returns></returns>
        private async Task <GuestRequest> SendGraphInvitationAsync(GraphInvitation invitation, List <GroupObject> groups, GuestRequest request, string inviterResponseEmailAddr = null, InviteTemplate mailTemplate = null, string accessToken = null)
        {
            AdalResponse    serverResponse = null;
            GraphInvitation responseData   = new GraphInvitation();

            try
            {
                var inviteEndPoint = string.Format("{0}/{1}/invitations", Settings.GraphResource, Settings.GraphApiVersion);

                // Invite user. Your app needs to have User.ReadWrite.All or Directory.ReadWrite.All to invite
                serverResponse = AdalUtil.CallGraph(inviteEndPoint, invitation, false, null, _user, accessToken);

                responseData             = JsonConvert.DeserializeObject <GraphInvitation>(serverResponse.ResponseContent);
                request.InvitationResult = responseData;
                request.Status           = responseData.Status;

                if (responseData.id == null)
                {
                    //API call failed - put the request back in the queue
                    responseData.ErrorInfo   = string.Format("Error: Invite not sent - API error: {0}", serverResponse.Message);
                    request.InvitationResult = responseData;
                    request.Disposition      = Disposition.Pending;
                }
                else
                {
                    //invitation API call successful
                    if (responseData.Status.Substring(0, 5) == "Error")
                    {
                        //API call was successful but something failed while trying to process the request - put the request back in the queue
                        request.Disposition = Disposition.Pending;
                    }
                    else
                    {
                        //check to see if groups should be assigned
                        if (groups.Count > 0)
                        {
                            try
                            {
                                var groupsAdded = AddUserToGroup(responseData.InvitedUser.Id, groups);
                                if (!groupsAdded.Success)
                                {
                                    //group assignment failed
                                    var resErrors = string.Join(", ", groupsAdded.Responses.Where(r => !r.Successful).Select(r => r.Message));
                                    var msg       = string.Format("\n\rOne or more groups failed while assigning to user \"{0}\" ({1})", responseData.InvitedUserEmailAddress, resErrors);
                                    request.PostProcessingStatus += msg;
                                }
                            }
                            catch (Exception groupEx)
                            {
                                //group assignment errored
                                var msg = string.Format("\n\rAn error occured while assigning a group to user \"{0}\" ({1})", responseData.InvitedUserEmailAddress, groupEx.Message);
                                Logging.WriteToAppLog(msg, EventLogEntryType.Warning, groupEx);
                                request.PostProcessingStatus += msg;
                            }
                        }

                        //check to see if custom mail should be sent
                        if (Settings.UseSMTP)
                        {
                            try
                            {
                                mailTemplate = mailTemplate ?? Settings.CurrSiteConfig.InviteTemplateContent;

                                var emailSubject = mailTemplate.SubjectTemplate.Replace("{{InvitingOrgName}}", Settings.CurrSiteConfig.InvitingOrg);

                                string body = FormatEmailBody(responseData, inviterResponseEmailAddr, mailTemplate);
                                SendViaSMTP(emailSubject, body, invitation.InvitedUserEmailAddress);
                                request.MailSent = true;
                            }
                            catch (Exception mailEx)
                            {
                                var msg = string.Format("\n\rSending invitation failed for user \"{0}\" ({1})", responseData.InvitedUserEmailAddress, mailEx.Message);
                                Logging.WriteToAppLog(msg, EventLogEntryType.Warning, mailEx);
                                request.PostProcessingStatus += msg;
                            }
                        }
                    }
                }

                //all attempts complete, UPDATE GuestRequest
                await GuestRequestRules.UpdateAsync(request);

                return(request);
            }
            catch (Exception ex)
            {
                var reason = (serverResponse == null ? "N/A" : serverResponse.ResponseContent);
                responseData.ErrorInfo   = string.Format("Error: {0}<br>Server response: {1}", ex.Message, reason);
                request.InvitationResult = responseData;

                //UPDATE GuestRequest
                await GuestRequestRules.UpdateAsync(request);

                return(request);
            }
        }