Я внедрил пользовательскую аутентификацию, но как получить UserID через приложение

Я реализовал пользовательскую аутентификацию/авторизацию на основе этого руководства http://www.mattwrock.com/post/2009/10/14/Implementing-custom-Membership-Provider-and-Role-Provider-for-Authinticating.-ASPNET-MVC-Applications.aspx Работает нормально. Я реализовал это, потому что не хочу иметь хранимые процедуры в своей базе данных и возможность использовать разные СУБД. Но у меня есть одна проблема. Я аутентифицирую пользователя, но я не знаю, как где-то хранить UserId, поэтому, когда мне нужно получить что-то из базы данных на основе UserID, чтобы получить это. Что-то типа:

List<Product> products = productsRepository.GetProductsByUserId(User.UserID);

Как это сделать?

Кстати, есть ли лучший способ сделать пользовательскую аутентификацию/авторизацию, чем этот из этого руководства?

Спасибо




Ответы (3)


Если вы фактически реализовали все методы и заполняете встроенный MembershipUser, то просто Membership.GetUser().ProviderUserKey вернет UserId.

person Erik Funkenbusch    schedule 30.08.2011
comment
Есть ли в сети пример реализации этого метода? И теперь я уверен, почему в этом руководстве пользователь реализует интерфейс IPrincipal? - person 1110; 30.08.2011
comment
@ 1110 - IPrincipal не имеет ничего общего с членством. FormsAuthentication заботится об IPrincipal. Образец пользовательского поставщика членства должен содержать пример реализации GetUser для вашего поставщика. - person Erik Funkenbusch; 30.08.2011

в моем решении я использую

 Docent docent = DocentRepo.GetByID(User.Identity.Name);

может быть, это может быть полезно для вас

person Karel-Jan Misseghers    schedule 30.08.2011

Если вы используете FormsAuthentification, вы можете закодировать некоторые пользовательские данные в своем файле cookie / билете, кроме имени пользователя. Но вы должны вручную создать FormsAuthenticationTicket и установите для свойства UserData идентификатор пользователя во время входа в систему. Таким образом, вы можете иметь как имя пользователя, так и идентификатор пользователя.

        // during login
        var authCookie = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie);
        var ticket = FormsAuthentication.Decrypt(authCookie.Value);
        // preserve data in your configuration
        var ticketWithId = new FormsAuthenticationTicket(
                                version: ticket.Version,
                                name: ticket.Name,
                                issueDate: ticket.IssueDate,
                                expiration: ticket.Expiration,
                                isPersistent: ticket.IsPersistent,
                                userData: userId);

        authCookie.Value = FormsAuthentication.Encrypt(ticketWithId);
        _context.Response.Cookies.Add(authCookie);

Затем у вас может быть метод расширения для классов Controller или HttpContext:

    public int? GetUserId(this Controller controller) {
        var identity = (FormsIdentity)controller.User.Identity;
        int id;
        if (int.TryParse(identity.Ticket.UserData, out id))
            return id;
        return null;
    }

Но если вам не нужны данные UserId и UserName для вашего пользователя, тогда HttpContext.User.Identity.Name или Controller.User.Identity.Name будет иметь имя пользователя для вашего текущего пользователя.

person Vasea    schedule 30.08.2011