C # LDAP AD Authentication, используйте Должность для авторизации - PullRequest
0 голосов
/ 29 мая 2018

Я видел много онлайн-статей и примеров кодов о том, как использовать авторизацию на основе ролей, но не могу найти ничего, связанного с авторизацией на основе заголовков.

У меня есть следующее в классе для аутентификации AD:

 protected ClaimsIdentity CreateIdentity(UserPrincipalExtended userPrincipal)
    {
        var identity = new ClaimsIdentity(MyAuthentication.ApplicationCookie, ClaimsIdentity.DefaultNameClaimType,
            ClaimsIdentity.DefaultRoleClaimType);
        identity.AddClaim(new Claim(
            "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider",
            "Active Directory"));
        identity.AddClaim(new Claim(ClaimTypes.Name, userPrincipal.Name));
        identity.AddClaim(new Claim(ClaimTypes.GivenName, userPrincipal.GivenName ?? string.Empty));
        identity.AddClaim(new Claim(ClaimTypes.Surname, userPrincipal.Surname ?? string.Empty));
        identity.AddClaim(new Claim(userPrincipal.Title, userPrincipal.Title ?? string.Empty));
        identity.AddClaim(new Claim(userPrincipal.Department, userPrincipal.Department ?? string.Empty));
        identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userPrincipal.SamAccountName));
        if (!string.IsNullOrEmpty(userPrincipal.EmailAddress))
            identity.AddClaim(new Claim(ClaimTypes.Email, userPrincipal.EmailAddress));

        var claims = new List<Claim>();
        var dirEntry = (DirectoryEntry) userPrincipal.GetUnderlyingObject();
        foreach (string groupDN in dirEntry.Properties["memberOf"])
        {
            var parts = groupDN.Replace("CN=", "").Split(',');
            claims.Add(new Claim(ClaimTypes.Role, parts[0]));
        }


        if (claims.Count > 0)
            identity.AddClaims(claims);


        var title = dirEntry.Properties["title"].Value.ToString();
        return identity;
    }

Это отлично работает, и я вижу правильный заголовок и отдел, извлеченные из Active Directory.Очевидно, я использую расширенный UserPrincipal, поскольку заголовок и отдел не являются частью стандартного UserPrincipal.

Моя проблема заключается в том, что я не могу передать значения заголовка и отдела в мой контроллер для авторизации.

В HomeController я получаю информацию аутентифицированного пользователя с помощью следующего:

var firstname = System.Web.HttpContext.Current.User.GetFirstname();
var lastname = System.Web.HttpContext.Current.User.GetLastname();
var email = System.Web.HttpContext.Current.User.GetEmail();
var uid = System.Web.HttpContext.Current.User.GetUserID();

Очевидно, что здесь используется стандартный IPrincipal, который не содержит положений для названия и отдела.

Есть ли простой способ передать заголовок и параметры отдела контроллеру?и можно ли использовать название для Авторизации доступа, а не Роли?

Заранее спасибо

1 Ответ

0 голосов
/ 29 мая 2018

У меня была похожая проблема, и я решил ее, используя (здесь в вашем случае) названия и отделы в качестве ролей.Это позволяет использовать все готовые функции авторизации на основе ролей.

if (userPrinciple.Title != null)
{
    identity.AddClaim(new Claim(ClaimTypes.Role, userPrincipal.Title));
}

if (userPrincipal.Department != null)
{
    identity.AddClaim(new Claim(ClaimTypes.Role, userPrincipal.Department));
}

Если роли относятся к конкретному отделу, вы можете комбинировать оба.

identity.AddClaim(new Claim(ClaimTypes.Role, $"{userPrincipal.Department}.{userPrincipal.Title}));
...