yaf интеграция с блогом engine2.0
Я успешно установил еще один код форума (yaf) и успешно интегрировал его с механизмом блогов 2.0. Теперь я хотел получить общий логин как для механизма блогов 2.0, так и для yaf, т. е. при автоматическом входе в систему для blog engine 2.0 необходимо войти в систему yaf. Кто-нибудь может предложить мне решение?
1 ответ
Измените MembershipPorivder в веб-конфигурации следующим образом:
//I have changaned the following to be able to genrate a password myself and to be able to retrive it when i want to login the use, you can change this if you want or just leave it as it is.
<membership defaultProvider="YafMembershipProvider" hashAlgorithmType="NONE" >
<providers>
<clear/>
<add connectionStringName="yafnet" applicationName="YetAnotherForum" name="YafMembershipProvider" passwordFormat="Clear" requiresUniqueEmail="true" useSalt="false" enablePasswordRetrieval="true" type="YAF.Providers.Membership.YafMembershipProvider"/>
</providers>
</membership>
Этот метод создаст YAFUser, все эти методы извлечены из кода библиотеки YAF, я просто много работал над ними, чтобы извлечь все, что я хочу:
/// <summary>
/// Register YAF User
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <param name="email"></param>
/// <param name="displayName"></param>
public static MembershipUser RegisterYAF_User(string userName, string password, string email, string displayName)
{
//Intilize YAFMembershipProvider
MembershipCreateStatus status;
YafMembershipProvider provider = new YafMembershipProvider();
NameValueCollection valueCollection = new NameValueCollection();
valueCollection.Add("connectionStringName", "yafnet");
valueCollection.Add("applicationName", "YetAnotherForum");
valueCollection.Add("passwordFormat", "Clear");
provider.Initialize("YafMembershipProvider", valueCollection);
//Register YAFMembershipUser
MembershipUser user = provider.CreateUser(userName, password, email, "What is your favorite football team ?", "None", true, new YAF.Providers.Profile.DB().GetProviderUserKey("YetAnotherForum", userName), out status);
//Register YAFUser
if (user != null)
{
//Add user to role
RoleMembershipHelper.AddUserToRole(user.UserName, "Registered");
// setup inital roles (if any) for this user
RoleMembershipHelper.SetupUserRoles(YafContext.Current.PageBoardID, userName);
// create the user in the YAF DB as well as sync roles...
int? userID = RoleMembershipHelper.CreateForumUser(user, user.UserName, YafContext.Current.PageBoardID);
// create empty profile just so they have one
YafUserProfile userProfile = YafUserProfile.GetProfile(user.UserName);
// setup their inital profile information
userProfile.Location = "USA";
userProfile.Homepage = string.Empty;
userProfile.Save();
LegacyDb.user_save(
UserMembershipHelper.GetUserIDFromProviderUserKey(user.ProviderUserKey),
YafContext.Current.PageBoardID,
null,
null,
null,
YafContext.Current.TimeZoneUser.ToType<int>(),
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null);
}
return user;
}
Эта функция используется для входа в YAFUser:
//Login yaf user
/// <summary>
/// Login
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
public static void LoginYAF_User(string userName, string password)
{
MembershipCreateStatus status;
YafMembershipProvider provider = new YafMembershipProvider();
NameValueCollection valueCollection = new NameValueCollection();
valueCollection.Add("connectionStringName", "yafnet");
valueCollection.Add("applicationName", "YetAnotherForum");
valueCollection.Add("passwordFormat", "Clear");
provider.Initialize("YafMembershipProvider", valueCollection);
bool Authenticated = false;
if (provider.ValidateUser(userName, password))
{
Authenticated = true;
FormsAuthentication.SetAuthCookie(userName, true);
}
else if (new YafBoardSettings().EnableDisplayName)
{
var id = new DefaultUserDisplayName(YafContext.Current.ServiceLocator).GetId(userName);
if (id.HasValue)
{
// get the username associated with this id...
userName = UserMembershipHelper.GetUserNameFromID(id.Value);
// validate again...
if (provider.ValidateUser(userName, password))
{
Authenticated = true;
}
}
}
//These 2 lines of code is to redirect to the fourm main page
//YafContext.Current.Get<IRaiseEvent>().Raise(new SuccessfulUserLoginEvent(YafContext.Current.CurrentUserData.UserID));
//YafBuildLink.Redirect(ForumPages.forum);
}
После этого перейдите к YAFMembershipProvider.cs и добавьте метод перегрузки, как показано ниже:
public string GetPassword(string username)
{
// Check for null arguments
if ((username == null))
{
ExceptionReporter.ThrowArgument("MEMBERSHIP", "USERNAMEPASSWORDNULL");
}
UserPasswordInfo currentPasswordInfo = UserPasswordInfo.CreateInstanceFromDB(
"YetAnotherForum",
username,
false,
this.UseSalt,
this.HashHex,
this.HashCase,
"",
this.MSCompliant);
return currentPasswordInfo.Password;
}
В этом я дал 99% процентов, остальное просто простое кодирование, так как для блога вы должны использовать ту же концепцию. Выполните поиск по DataLayer и получите все методы, которые вам нужны для синхронизации между любым количеством приложений.