257 lines
8.2 KiB
C#
257 lines
8.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Web;
|
|
using System.Web.UI;
|
|
using System.Web.UI.WebControls;
|
|
using System.Resources;
|
|
using System.Collections.Specialized;
|
|
using System.Reflection;
|
|
using Microsoft.SharePoint;
|
|
using Microsoft.SharePoint.WebControls;
|
|
using CKS.FormsBasedAuthentication.HIP;
|
|
using System.Web.Security;
|
|
|
|
|
|
namespace CKS.FormsBasedAuthentication
|
|
{
|
|
public class MembershipRequestControl : CreateUserWizard
|
|
{
|
|
enum CharMix { upper, lower, mix }
|
|
|
|
/// <summary>
|
|
/// Always disable the created user - enable it when it's approved by MembershipRequest
|
|
/// </summary>
|
|
public override bool DisableCreatedUser
|
|
{
|
|
get
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
#region Fields
|
|
protected string[] _randCharacters = { "A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z",
|
|
"2","3","4","5","6","7","8","9",
|
|
"a","b","c","d","e","f","g","h","j","k","m","n","p","q","r","s","t","u","v","w","x","y","z"};
|
|
|
|
private string _DefaultGroup = string.Empty;
|
|
#endregion
|
|
|
|
#region Controls
|
|
private IEditableTextControl _txtFirstName;
|
|
protected IEditableTextControl txtFirstName
|
|
{
|
|
get {
|
|
if (_txtFirstName == null)
|
|
{
|
|
_txtFirstName = (IEditableTextControl)this.CreateUserStep.ContentTemplateContainer.FindControl("FirstName");
|
|
}
|
|
return _txtFirstName;
|
|
}
|
|
}
|
|
private IEditableTextControl _txtLastName;
|
|
protected IEditableTextControl txtLastName
|
|
{
|
|
get
|
|
{
|
|
if (_txtLastName == null)
|
|
{
|
|
_txtLastName = (IEditableTextControl)this.CreateUserStep.ContentTemplateContainer.FindControl("LastName");
|
|
}
|
|
return _txtLastName;
|
|
}
|
|
}
|
|
private ITextControl _lblError;
|
|
protected ITextControl lblError
|
|
{
|
|
get
|
|
{
|
|
if (_lblError == null)
|
|
{
|
|
_lblError = (ITextControl)this.CreateUserStep.ContentTemplateContainer.FindControl("FBAErrorMessage");
|
|
}
|
|
return _lblError;
|
|
}
|
|
}
|
|
|
|
private ITextControl _lblCompleteSuccess;
|
|
protected ITextControl lblCompleteSuccess
|
|
{
|
|
get
|
|
{
|
|
if (_lblCompleteSuccess == null)
|
|
{
|
|
_lblCompleteSuccess = (ITextControl)this.CompleteStep.ContentTemplateContainer.FindControl("CompleteSuccess");
|
|
}
|
|
return _lblCompleteSuccess;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
public string FirstName
|
|
{
|
|
get { return txtFirstName.Text; }
|
|
set { txtFirstName.Text = value; }
|
|
}
|
|
|
|
public string LastName
|
|
{
|
|
get { return txtLastName.Text; }
|
|
set { txtLastName.Text = value; }
|
|
}
|
|
|
|
public string DefaultGroup
|
|
{
|
|
get { return _DefaultGroup; }
|
|
set { _DefaultGroup = value; }
|
|
}
|
|
|
|
public bool SPLoginCreatedUser { get; set; }
|
|
|
|
#endregion
|
|
|
|
#region Rendering Methods
|
|
|
|
|
|
private void SetHipControl()
|
|
{
|
|
ImageHipChallenge imgHip;
|
|
|
|
imgHip = this.CreateUserStep.ContentTemplateContainer.FindControl("HipPicture") as ImageHipChallenge;
|
|
|
|
if (imgHip != null)
|
|
{
|
|
StringCollection scWords = new StringCollection();
|
|
string randString = GenerateRandomString(6, CharMix.mix);
|
|
scWords.Add(randString);
|
|
imgHip.Words = scWords;
|
|
}
|
|
}
|
|
|
|
protected override void CreateControlHierarchy()
|
|
{
|
|
base.CreateControlHierarchy();
|
|
SetHipControl();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Events
|
|
|
|
private string GenerateRandomString(int NumAlphs, CharMix Mix)
|
|
{
|
|
Random rGen = new Random();
|
|
|
|
int iMix = (int)Mix;
|
|
|
|
int p = 0;
|
|
string sPass = "";
|
|
int iCharMax = 32;
|
|
if (iMix > 0) iCharMax = 55;
|
|
for (int x = 0; x < NumAlphs; x++)
|
|
{
|
|
p = rGen.Next(0, iCharMax);
|
|
sPass += _randCharacters[p];
|
|
}
|
|
if (iMix < 1)
|
|
{
|
|
sPass = sPass.ToUpper();
|
|
}
|
|
else if (iMix < 2)
|
|
{
|
|
sPass = sPass.ToLower();
|
|
}
|
|
return sPass;
|
|
}
|
|
#endregion
|
|
|
|
protected override void OnContinueButtonClick(EventArgs e)
|
|
{
|
|
base.OnContinueButtonClick(e);
|
|
|
|
HttpContext.Current.Response.Redirect(FinishDestinationPageUrl);
|
|
|
|
}
|
|
|
|
protected override void OnCreatedUser(EventArgs e)
|
|
{
|
|
// Note: this doesn't run using the privileges of the anonymous user, so we elevate them
|
|
// Also, you can't use the original Site even with elevated privileges, otherwise it reverts back to anonymous.
|
|
SPSecurity.RunWithElevatedPrivileges(delegate()
|
|
{
|
|
using (SPSite site2 = new SPSite(SPContext.Current.Site.ID, SPContext.Current.Site.Zone))
|
|
{
|
|
using (SPWeb web2 = site2.OpenWeb(SPContext.Current.Web.ID))
|
|
{
|
|
// from this point allowunsafeupdates is required because the call is initiated from a browser with
|
|
// anonymouse rights only
|
|
web2.AllowUnsafeUpdates = true;
|
|
|
|
MembershipRequest request = new MembershipRequest();
|
|
request.UserEmail = this.Email;
|
|
request.UserName = this.UserName;
|
|
if (System.Web.Security.Membership.RequiresQuestionAndAnswer)
|
|
{
|
|
request.PasswordQuestion = this.Question;
|
|
request.PasswordAnswer = this.Answer;
|
|
}
|
|
request.FirstName = this.FirstName;
|
|
request.LastName = this.LastName;
|
|
request.DefaultGroup = this._DefaultGroup;
|
|
|
|
request.SiteName = web2.Title;
|
|
request.SiteURL = web2.Url;
|
|
|
|
MembershipSettings settings = new MembershipSettings(web2);
|
|
|
|
if (settings.ReviewMembershipRequests)
|
|
{
|
|
request.LoginCreatedUser = false;
|
|
|
|
if (!MembershipRequest.CopyToReviewList(request))
|
|
{
|
|
lblError.Text = this.UnknownErrorMessage;
|
|
return;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
#region Process new user request if we're NOT using the Request List
|
|
|
|
if (!AutoGeneratePassword)
|
|
{
|
|
request.Password = this.Password;
|
|
}
|
|
|
|
request.ChangePasswordURL = Utils.GetAbsoluteURL(web2, settings.ChangePasswordPage);
|
|
request.LoginCreatedUser = SPLoginCreatedUser;
|
|
|
|
try
|
|
{
|
|
MembershipRequest.ApproveMembership(request, web2);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.LogError(ex);
|
|
this.lblCompleteSuccess.Text = this.UnknownErrorMessage;
|
|
return;
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
this.MoveTo(this.CompleteStep);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|
|
}
|