2009-09-14 3 views
0

Мое приложение имеет несколько разных типов пользователей с их собственными членами. Например, у меня есть пользователь-ученик, а также пользователь-учитель. Я аутентифицирую своих пользователей через активный каталог в моем обычном методе ValidateUser MembershipProvider. При запросе AD я вытаскиваю всю соответствующую информацию. Я хотел бы поставить эту информацию в профиль, но от того, что я прочитал и примеры Я сено, вы можете определить только один профиль (вроде так):Возможно иметь несколько профилей в ASP.NET для разных пользователей?

<profile defaultProvider="CustomProfileProvider" enabled="true"> 
    <properties> 
     <add name="YearLevel" type="String" /> 
     <add name="Name" type="String" /> 
     <add name="Age" type="String" /> 
    </properties> 
</profile> 

выше профиль будет работа для ученика, но не для учителя, который не имеет значения для «YearLevel» в AD. Возможно ли иметь несколько профилей для этого? Или проще добавить все свойства из AD, охватывающего все типы пользователей, а затем в моем коде просто проверить, какой тип пользователя они есть, а затем получить доступ к их конкретным свойствам?

ответ

1

Вы действительно только 2 варианта здесь:

  1. Вы можете просто создать «большой» профиль с полями для всех типов пользователей, а затем получить доступ только поля для данного типа пользователя вы используете. (Я не рекомендую это, но это может быть быстрое исправление).

  2. Внедрение настраиваемого поставщика профилей - это совсем не так сложно. Вы можете узнать больше об этом здесь: http://msdn.microsoft.com/en-us/library/0580x1f5.aspx

0

Да, я боюсь, что вы должны указать все возможные свойства, если вы собираетесь использовать модель профиля. Если вы идете по этому маршруту, я бы предложил использовать какой-то прокси-сервер, который возьмет пользователя и на его основе заполнит соответствующие свойства.

что-то вроде

public static class ProfileProxy<T> 
{ 
    public static void FillProperties(T user) 
    { 
     if(user is Teacher) 
     { 
      //Pull & fill profile properties for teacher 
     } 
     else 
     { 
      //Pull & fill profile properties for student 
     } 
    } 
} 

Я хотел бы рассмотреть наличие двух разных таблиц, хотя, которые держат два объекта по отдельности, или реализовать пользовательский поставщик профили.

0

Вы можете создать объект и сохранить его в профиле. Например:

[Serializable] 
public class ProfileObject { } 

[Serializable] 
class StudentProfile : ProfileObject 
{ 
    public string Year {get;set;} 
    public string Name {get;set;} 
    public string Age {get;set;} 
} 

[Serializable] 
class TeacherProfile : ProfileObject 
{ 
    public string Department {get;set;} 
    public string Tenure {get;set;} 
    public string Rating {get;set;} 
} 

В web.config:

<profile> 
... 
     <properties> 
     <add name="UserProfile" allowAnonymous="false" type="ProfileObject" serializeAs="Xml"/> 
     </properties> 
</profile> 

Edit: Я не могу вспомнить, если вы можете использовать интерфейс как тип или нет. Изменил объект.

Доступ к этому через Profile.UserProfile (избыточно, но он работает). Затем, чтобы обработать это, вы должны проверить тип:

if(Profile.UserProfile is StudentProfile) { /* do something */ } else 
if(Profile.UserProfile is TeacherProfile) { /* do something */ } // etc. 

Вы также можете хранить дженерики в объекте профиля (? Авось Словарь Ниже реализация я использовал)

например:

namespace Model 
{ 
    [Serializable] 
    public class RecentlyViewed : List<Model.Product> 
    { 
     public RecentlyViewed() {} 
    } 
} 

И в web.config:

<profile> 
... 
     <properties> 
     <add name="RecentlyViewed" allowAnonymous="false" type="Model.RecentlyViewed" serializeAs="Xml"/> 
     </properties> 
</profile> 

Я использовал этот метод в .NET 3.5, я не уверен, работает ли он в .NET 2 или 3.Я бы предположил, что генерики обрабатываются одинаково, поскольку компилятор не изменился.

Примечание: Это необходимо наследовать общий объект в пустой объект, так как настройка профиля не нравится следующее:

<profile> 
... 
     <properties> 
     <add name="RecentlyViewed" allowAnonymous="false" type="System.Collections.Generic.List`1[Model.Product]" serializeAs="Xml"/> 
     </properties> 
</profile> 

выше является полностью квалифицированное имя IL, как это действительно должно выглядеть. Кажется, что XML не похож на галочку.

Я не исследовал какие-либо проблемы с производительностью при хранении сериализованных объектов в объекте Profile, и поэтому я бы не рекомендовал это для каких-либо свойств, которые вам понадобятся на регулярной основе.

1

EDIT 2015-01-26: Хм ... у меня только что поднялся 1, но я на самом деле думаю, что этого не должно было быть. Теперь, когда я перечитал вопрос и свой собственный ответ более двух лет назад, я на самом деле НЕ ДЕЛАЮТ. Возможно, вы можете использовать свойства двух разных типов в две разные группы (по крайней мере, «ортогональные» свойства), но вам все еще нужен код, чтобы отличить два. Таким образом, я бы пошел с ответом или ответом Джима Шуберта ENDEDIT

Разве это не то, что profile groups? Нравится:

<profile> 
    <properties> 
    <group name="UserInfo"> 
     <add name="Name"/> 
     <add name="Age"/> 
    </group> 
    <group name="MemberInfo"> 
     <add name="MemberID"/> 
     <add name="JoinDate"/> 
    </group> 
    </properties> 
</profile> 
Смежные вопросы