Где я могу установить роли в AuthorizeServices MVC.NET? - PullRequest
4 голосов
/ 14 сентября 2009

Я не знаю, что мне не хватает, и я не знаю, что еще читать, чтобы понять это правильно. Я попробую этот серый вопрос, чтобы увидеть, подхожу ли я к решению. Я строю .NET MVC приложение.

Это приложение аутентифицируется с помощью OpenID с использованием библиотеки DotNetOpenAuth, все работает нормально. Как только пользователь проходит аутентификацию, я заново записываю токен openid в базу данных и создаю аутентификацию на основе форм, как показано ниже.

            FormsAuthentication.SetAuthCookie(confirmedUser.OpenID, false);

После этого этот пользователь передает все атрибуты полномочий в моем коде. Как ниже:

    [Authorize]
    public ActionResult About()
    {
        return View();
    }

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

Мне нужно настроить атрибуты, как показано ниже:

    [Authorize(Roles="Administrator")]
    public ActionResult About()
    {
        return View();
    }

Ответы [ 2 ]

7 голосов
/ 14 сентября 2009

Прежде всего, хорошо, если вы не пользуетесь услугами провайдера. Это просто плохо работает с OpenID.

Чтобы роли работали без поставщика членства, вам необходимо реализовать собственный класс, производный от System.Web.Security.RoleProvider. Он полностью отошел от аутентификации, что облегчает вам задачу. Вам просто нужно хранить вместе с каждым вашим пользователем в вашей базе данных, к каким ролям он принадлежит, и тогда ваш RoleProvider взаимодействует с этой базой данных.

Как только вы напишите класс поставщика ролей, свяжите его с этим в файле web.config. Этот фрагмент должен появиться в вашем разделе system.web.

<roleManager enabled="true" defaultProvider="Database">
    <providers>
        <add name="Database" type="MyRoleProvider" />
    </providers>
</roleManager>

Вот один поставщик ролей, который я написал для веб-приложения OpenID. Он написан с использованием Linq to Entities, но вы можете получить идею и реализовать ее для работы с вашей базой данных.

public class MyRoleProvider : RoleProvider {
    public override string ApplicationName {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }

    public override void AddUsersToRoles(string[] usernames, string[] roleNames) {
        var users = from token in Global.DataContext.AuthenticationToken
                    where usernames.Contains(token.ClaimedIdentifier)
                    select token.User;
        var roles = from role in Global.DataContext.Role
                    where roleNames.Contains(role.Name, StringComparer.OrdinalIgnoreCase)
                    select role;
        foreach (User user in users) {
            foreach (Role role in roles) {
                user.Roles.Add(role);
            }
        }
    }

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) {
        var users = from token in Global.DataContext.AuthenticationToken
                    where usernames.Contains(token.ClaimedIdentifier)
                    select token.User;
        var roles = from role in Global.DataContext.Role
                    where roleNames.Contains(role.Name, StringComparer.OrdinalIgnoreCase)
                    select role;
        foreach (User user in users) {
            foreach (Role role in roles) {
                user.Roles.Remove(role);
            }
        }
    }

    public override void CreateRole(string roleName) {
        Global.DataContext.AddToRole(new Role { Name = roleName });
    }

    /// <summary>
    /// Removes a role from the data source for the configured applicationName.
    /// </summary>
    /// <param name="roleName">The name of the role to delete.</param>
    /// <param name="throwOnPopulatedRole">If true, throw an exception if <paramref name="roleName"/> has one or more members and do not delete <paramref name="roleName"/>.</param>
    /// <returns>
    /// true if the role was successfully deleted; otherwise, false.
    /// </returns>
    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) {
        Role role = Global.DataContext.Role.SingleOrDefault(r => r.Name == roleName);
        if (role == null) {
            return false;
        }

        if (throwOnPopulatedRole && role.Users.Count > 0) {
            throw new InvalidOperationException();
        }

        Global.DataContext.DeleteObject(roleName);
        return true;
    }

    /// <summary>
    /// Gets an array of user names in a role where the user name contains the specified user name to match.
    /// </summary>
    /// <param name="roleName">The role to search in.</param>
    /// <param name="usernameToMatch">The user name to search for.</param>
    /// <returns>
    /// A string array containing the names of all the users where the user name matches <paramref name="usernameToMatch"/> and the user is a member of the specified role.
    /// </returns>
    public override string[] FindUsersInRole(string roleName, string usernameToMatch) {
        return (from role in Global.DataContext.Role
                where role.Name == roleName
                from user in role.Users
                from authTokens in user.AuthenticationTokens
                where authTokens.ClaimedIdentifier == usernameToMatch
                select authTokens.ClaimedIdentifier).ToArray();
    }

    public override string[] GetAllRoles() {
        return Global.DataContext.Role.Select(role => role.Name).ToArray();
    }

    public override string[] GetRolesForUser(string username) {
        return (from authToken in Global.DataContext.AuthenticationToken
                where authToken.ClaimedIdentifier == username
                from role in authToken.User.Roles
                select role.Name).ToArray();
    }

    public override string[] GetUsersInRole(string roleName) {
        return (from role in Global.DataContext.Role
                where string.Equals(role.Name, roleName, StringComparison.OrdinalIgnoreCase)
                from user in role.Users
                from token in user.AuthenticationTokens
                select token.ClaimedIdentifier).ToArray();
    }

    public override bool IsUserInRole(string username, string roleName) {
        Role role = Global.DataContext.Role.SingleOrDefault(r => string.Equals(r.Name, roleName, StringComparison.OrdinalIgnoreCase));
        if (role != null) {
            return role.Users.Any(user => user.AuthenticationTokens.Any(token => token.ClaimedIdentifier == username));
        }

        return false;
    }

    public override bool RoleExists(string roleName) {
        return Global.DataContext.Role.Any(role => string.Equals(role.Name, roleName, StringComparison.OrdinalIgnoreCase));
    }
}
0 голосов
/ 14 сентября 2009

Я все еще изучаю этот материал, но вам, вероятно, нужно создать собственный атрибут авторизации. Проверьте это .

...