Я пытаюсь добавить образец профиля провайдера таблицы из http://www.asp.net/downloads/sandbox/table-profile-provider-samples на новый сайт MVC 2.
После небольшого исследования и возни, я пришел к профилюкласс, который выглядит следующим образом.
namespace MyNamespace.Models
{
public class UserProfile : ProfileBase
{
[SettingsAllowAnonymous(false),CustomProviderData("FirstName;nvarchar")]
public string FirstName
{
get { return base["FirstName"] as string; }
set { base["FirstName"] = value; }
}
[SettingsAllowAnonymous(false),CustomProviderData("LastName;nvarchar")]
public string LastName
{
get { return base["LastName"] as string; }
set { base["LastName"] = value; }
}
public static UserProfile GetUserProfile(string username)
{
return Create(username,false) as UserProfile;
}
public static UserProfile GetUserProfile()
{
return Create(Membership.GetUser().UserName,true) as UserProfile;
}
}
}
И web.config вроде
<profile enabled="true" defaultProvider="TableProfileProvider" inherits="MyNamespace.Models.UserProfile">
<providers>
<clear />
<add name="TableProfileProvider" type="Microsoft.Samples.SqlTableProfileProvider" connectionStringName="ContentDB" table="aspnet_UserProfiles" applicationName="/"/>
</providers>
</profile>
Вещи, которые я думаю, я обнаружил на этом пути:
- Для использования собственного провайдера с MVC требуется атрибут «наследует» для элемента
<profile>
в файле web.config, что исключает использование конструкции <properties><add ....>
с тем же именем поля профиля. - Пример SQLПровайдеру табличного профиля необходим атрибут
CustomProviderData
, и поэтому он не может отображаться в файле web.config, поэтому его необходимо добавить в качестве атрибута к свойствам в классе профиля.
Кажется, все работает нормально , как только пользователь вошел в систему .Однако я хочу получить некоторые данные профиля как часть нового процесса регистрации пользователя, и я не могу получить доступ к объекту профиля, пока пользователь не вошел в систему.
Я попытался добавить вызов, чтобы сохранить профильданные в разделе регистрации нового пользователя кода шаблона MVC:
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
UserProfile profile = UserProfile.GetUserProfile(Membership.GetUser().UserName);
profile.FirstName = "Doug";
Profile.Save();
return RedirectToAction("Index", "Home");
Однако кажется, что Membership.GetUser()
является нулевым, пока пользователь фактически не войдет в систему. Я также пытался использовать имя пользователя из модели.
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
UserProfile profile = UserProfile.GetUserProfile(model.UserName);
profile.FirstName = "Doug";
profile.Save();
return RedirectToAction("Index", "Home");
Это идет немного дальше, но не удается при попытке установить поле профиля FirstName, с сообщением об ошибке в виде строки "попытка установить атрибут как анонимного пользователя, но это не разрешено"(извините, у меня нет доступа к точному сообщению, так как я его печатаю).
Есть ли способ обойти это?Похоже, что метод FormsServer.SignIn
на самом деле не регистрирует пользователя в том, что касается проверки подлинности на основе форм, и для полного входа в систему требуется круговая передача, предположительно, необходим файл cookie для отправки обратно на сервер.
Если нет простого способа обойти это, я мог бы заполнить таблицу профилей напрямую, используя методы доступа к данным (вставить в aspnet_UserProfiles ....).Это мост слишком далеко или это жизнеспособное решение?
Ни у кого не было этой проблемы?Нет?Только я тогда!
Просто чтобы обновить, я попробовал предложение, которое Франци Пенов делает в своем ответе на эту публикацию .
Итак, теперь мой код выглядит так.
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
GenericIdentity id = new GenericIdentity(model.UserName);
HttpContext.User = new GenericPrincipal(id, null);
UserProfile profile = UserProfile.GetUserProfile(Membership.GetUser().UserName) as UserProfile;
profile.FirstName = "Doug";
profile.Save();
return RedirectToAction("Index", "Home");
Теперь, по крайней мере, вызов Membership.GetUser () возвращает действительный объект MembershipUser
, но попытка установить свойство профиля FirstName по-прежнему приводит к сообщению This property cannot be set for anonymous users.
Итак, пользователь вошел в систему с точки зрения членства, но система профилей по-прежнему считает, что нет.
Есть идеи?