Аутентификация пользователей с помощью активного каталога [дубликат]

неопределенная ссылка на WinMain@16 или аналогичную «необычную» main() ссылку на точку входа (особенно для ).

Вы возможно, пропустили, чтобы выбрать правильный тип проекта с вашей реальной IDE. IDE может захотеть связать, например. Проекты приложений Windows для такой функции точки входа (как указано в недостающей ссылке выше) вместо обычной int main(int argc, char** argv);.

Если ваша среда IDE поддерживает Plain Console Projects , вы может захотеть выбрать этот тип проекта вместо проекта приложения Windows.


Здесь case1 и case2 обрабатываются более подробно из реальный мир проблема.

12
задан Mike 23 November 2013 в 02:26
поделиться

2 ответа

Я как раз собирался добавить свой собственный вопрос в StackOverflow с моим решением, чтобы помочь другим с этой проблемой, когда я увидел ваш существующий вопрос. Похоже, это будет очень распространено, но информация о том, как это сделать, распространяется только между несколькими источниками и трудно отслеживать. Существует не только один полный ресурс, поэтому, надеюсь, это поможет вам и другим.

Лучший способ сделать это - использовать расширение UserPrincipal. В принципе, вы подклассифицируете UserPrincipal из System.DirectoryServices.AccountManagement и добавляете свои собственные дополнительные свойства. Это активируется с помощью методов ExtensionGet и ExtensionSet (несколько магических).

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("user")]
public class UserPrincipalExtended : UserPrincipal
{
    public UserPrincipalExtended(PrincipalContext context) : base(context)
    {
    }

    public UserPrincipalExtended(PrincipalContext context, string samAccountName, string password, bool enabled)
        : base(context, samAccountName, password, enabled)
    {
    }

    [DirectoryProperty("title")]
    public string Title
    {
        get
        {
            if (ExtensionGet("title").Length != 1)
                return null;

            return (string)ExtensionGet("title")[0];
        }

        set
        {
            ExtensionSet( "title", value );
        }
    }

    [DirectoryProperty("department")]
    public string Department
    {
        get
        {
            if (ExtensionGet("department").Length != 1)
                return null;

            return (string)ExtensionGet("department")[0];
        }

        set
        {
            ExtensionSet("department", value);
        }
    }

    public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, string identityValue)
    {
        return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityValue);
    }

    public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
    {
        return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityType, identityValue);
    } 
}

Два атрибута класса должны быть настроены для вашего экземпляра AD. Значение для DirectoryRdnPrefix должно быть RDN (относительное различающееся имя) в AD, а значение для DirectoryObjectClass должно быть именем типа объекта каталога в AD для класса userObject. Для типичной настройки доменных служб AD оба они должны использоваться в коде, представленном выше, но для настройки LDS они могут отличаться . Я добавил два новых свойства, которые использует моя организация: «title» и «department». Из этого вы можете получить представление о том, как добавить любое другое свойство, которое вам нравится: в основном вы просто создаете свойство, используя шаблон, который я здесь предоставил. Свойству можно назвать все, что вам нравится, но строковое значение, переданное в DirectoryProperty и внутри блока кода, должно совпадать с именем свойства из AD. Используя это, вы можете использовать PrincipalContext с вашим подклассом вместо UserPrincipal, чтобы вернуть пользовательский объект со свойствами, которые вам нужно добавить.

UserPrincipalExtended user = UserPrincipalExtended.FindByIdentity(
    new PrincipalContext(ContextType.Domain), User.Identity.Name);

И получить доступ к своей собственности, как и любой другой экземпляр UserPrincipal:

// User's title
user.Title

Если вы не знакомы с System.DirectoryServices.AccountManagement.UserPrincipal, есть несколько свойств пользователя, испеченных в: GivenName, Surname, DisplayName и т. д. В частности к вашим обстоятельствам, поскольку вы специально указали телефон и электронную почту, есть VoiceTelephoneNumber и EmailAddress. Полный список можно просмотреть в документах MSDN . Если вам нужна только встроенная информация, вам не нужно расширять UserPrincipal, как я показал выше. Вы просто сделали бы:

UserPrincipal user = UserPrincipal.FindByIdentity(
    new PrincipalContext(ContextType.Domain), User.Identity.Name);

Но, в 9 раз из 10, встроенных модулей будет недостаточно, так что хорошо знать, как легко добраться.

Наконец, я не хотел добавлять строки @using в любое представление, которое использует это, поэтому я пошел дальше и добавил пространства имен в web.config папки Views. Эта часть важна, ее необходимо добавить в папку web.config папки Views, а не в папку проекта (и отдельную папку Views для каждого региона, если вы используете области).

<system.web.webPages.razor>
    ...
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            ...
            <add namespace="System.DirectoryServices.AccountManagement" />
            <add namespace="Namespace.For.Your.Extension" />
        </namespaces>
    </pages>
</system.web.webPages.razor>
29
ответ дан Chris Pratt 24 August 2018 в 02:34
поделиться
-1
ответ дан Stanislovas Kalašnikovas 24 August 2018 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: