我經歷了10年的文檔,我正在做正確的事情,但我相信這是我錯過的一個小細節。Umbraco 7自定義會員和角色提供商
我想用我自己的登錄機制登錄我的網站。登錄機制位於身份服務器中進行單點登錄。
但我想在umbraco中使用公共訪問功能,所以我從我的本地數據庫添加角色。通過改變配置文件
<roleManager enabled="true" defaultProvider="UmbracoRoleProvider">
<providers>
<clear />
<add name="UmbracoRoleProvider" type="rcsedWebServiceBLL.RCSEdRoleProvider" />
</providers>
</roleManager>
貫徹RoleProvider
class RCSEdRoleProvider : RoleProvider
{
private string _ApplicationName = "UmbracoRoleProvider";
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override string ApplicationName
{
get { return _ApplicationName; }
set
{
if(string.IsNullOrEmpty(value))
throw new ProviderException("ApplicationName Cacnnot be Empty");
if(value.Length > 0x100)
throw new ProviderException("provider application name too long");
_ApplicationName = value;
}
}
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}
public override string[] GetAllRoles()
{
return UBISRoles.GetRoleList();
}
public override string[] GetRolesForUser(string username)
{
// code to return user role access
try
{
//ool isAuthenticateSession = RCSEd.UolsSecurity.CommonFunctions.CheckAuthenticateSessionOrNot();
if (HttpContext.Current.Session["UOSStudent"] != null)
{
return (String[])HttpContext.Current.Session["userRoles"];
}
else
{
List<String> retval = new List<string>();
retval.Add("Public");
return retval.ToArray();
}
}
catch (Exception ex)
{
// AppLogWriter _objApplog = new AppLogWriter();
// _objApplog.WriteLogMessages(ex.Message.ToString());
//TODO catch Error
List<String> retval = new List<string>();
retval.Add("Public");
return retval.ToArray();
}
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}
public override bool IsUserInRole(string username, string roleName)
{
try
{
foreach (String role in (String[])HttpContext.Current.Session["userRoles"])
{
if (String.Compare(role, roleName, true) == 0)
return true;
}
return false;
}
catch { }
return false;
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override bool RoleExists(string roleName)
{
foreach (string val in UBISRoles.GetRoleList())
{
if (val == roleName)
return true;
}
return false;
}
}
class UBISRoles
{
private static string[] allroles = new string[] { //"Public",
"MembershipCandidate",
"MembershipMember"
};
public static string[] GetRoleList()
{
return allroles;
}
public static void SetRoles(DataTable UBIsRolesResultsTBL)
{
List<String> userRoles = new List<string>();
DataRow rec = UBIsRolesResultsTBL.Rows[0];
switch (rec["Membership"].ToString())
{
case "member":
userRoles.Add("MembershipMember");
break;
case "pending member":
userRoles.Add("MembershipPending");//add
break;
case "public":
userRoles.Add("MembershipPublic");//add
break;
}
HttpContext.Current.Session["userRoles"] = userRoles.ToArray();
}
private static void CheckSimpleFieldVal(List<String> userRoles, DataRow rec, string roleName)
{
try
{
if (string.Compare(rec[roleName].ToString(), "YES", true) == 0)
userRoles.Add(roleName);
}
catch (Exception ex)
{
string msg = ex.Message;
}
}
private static void CheckSimpleFieldValV2(List<String> userRoles, DataRow rec, string roleName)
{
try
{
if (string.Compare(rec[roleName].ToString(), "1", true) == 0)
userRoles.Add(roleName);
}
catch (Exception ex)
{
string msg = ex.Message;
}
}
}
而這個工作正常,一切都被裝在會員羣體一把umbraco內勤。
但是,當我嘗試實現MembershipProvider時,我覺得事情不起作用。 web配置是這個樣子
<membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add name="UmbracoMembershipProvider" type="rcsedWebServiceBLL.RCSEdMembershipProvide" />
<add name="UsersMembershipProvider" type="Umbraco.Web.Security.Providers.UsersMembershipProvider, Umbraco" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="4" useLegacyEncoding="true" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" passwordFormat="Hashed" />
</providers>
</membership>
而且Membershiprovider類這個樣子的
class RCSEdMembershipProvide : MembershipProvider
{
string connectionStringName;
private string _ApplicationName = "UmbracoMembershipProvider";
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(name, config);
/* if (config["ConnectionStringName"] != null)
connectionStringName = config["connectionStringName"];*/
}
public override string ApplicationName
{
get { return _ApplicationName; }
set
{
if (string.IsNullOrEmpty(value))
throw new ProviderException("ApplicationName Cacnnot be Empty");
if (value.Length > 0x100)
throw new ProviderException("provider application name too long");
_ApplicationName = value;
}
}
public override bool ChangePassword(string username, string oldPassword, string newPassword)
{
throw new NotImplementedException();
}
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
throw new NotImplementedException();
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
throw new NotImplementedException();
}
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
throw new NotImplementedException();
}
public override bool EnablePasswordReset
{
get { throw new NotImplementedException(); }
}
public override bool EnablePasswordRetrieval
{
get { throw new NotImplementedException(); }
}
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new NotImplementedException();
}
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new NotImplementedException();
}
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
{
throw new NotImplementedException();
}
public override int GetNumberOfUsersOnline()
{
throw new NotImplementedException();
}
public override string GetPassword(string username, string answer)
{
throw new NotImplementedException();
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
try
{
User user = (User)HttpContext.Current.Session["user"];
if (user != null)
return new MembershipUser("RCSEdMembershipProvider", user.DisplayName, username, user.Email, "", "", true, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
else
return null;
}
catch
{
return null;
}
}
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
try
{
User user = (User)HttpContext.Current.Session["user"];
if (user != null)
return new MembershipUser("RCSEdMembershipProvider", user.DisplayName, providerUserKey, user.Email, "", "", true, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
else
return null;
}
catch
{
return null;
}
}
public override string GetUserNameByEmail(string email)
{
throw new NotImplementedException();
}
public override int MaxInvalidPasswordAttempts
{
get { throw new NotImplementedException(); }
}
public override int MinRequiredNonAlphanumericCharacters
{
get { throw new NotImplementedException(); }
}
public override int MinRequiredPasswordLength
{
get { throw new NotImplementedException(); }
}
public override int PasswordAttemptWindow
{
get { throw new NotImplementedException(); }
}
public override MembershipPasswordFormat PasswordFormat
{
get { throw new NotImplementedException(); }
}
public override string PasswordStrengthRegularExpression
{
get { throw new NotImplementedException(); }
}
public override bool RequiresQuestionAndAnswer
{
get { throw new NotImplementedException(); }
}
public override bool RequiresUniqueEmail
{
get { throw new NotImplementedException(); }
}
public override string ResetPassword(string username, string answer)
{
throw new NotImplementedException();
}
public override bool UnlockUser(string userName)
{
throw new NotImplementedException();
}
public override void UpdateUser(MembershipUser user)
{
throw new NotImplementedException();
}
public override bool ValidateUser(string username, string password)
{
return true;
}
}
我甚至把的ValidateUser是真正的所有時間。
因此,當用戶登錄到我的身份服務器時,我加載了HttpContext.Current.Session["userRoles"]
中的用戶角色,並限制了我的網頁的公共訪問權限並將用戶重定向到正確的頁面。
當用戶沒有登錄時,用戶被重定向到登錄頁面,但是當用戶返回並且他/她的角色被加載並嘗試訪問受限制的頁面時,會員供應商ValidateUser
不會被擊中並且用戶被一次又一次重定向回登錄頁面。
PS。我正在使用umbraco 7.1.3
對不起,但我想覆蓋我所有的步驟。先謝謝你。
您對登錄的看法如何? –
你能解釋一下你是什麼意思?這是一個正常的登錄頁面。但正如我上面提到的,它設置在一個不同的項目中,因爲它是架構的單一標誌。 –