Информация о профиле обновления OpenId

Какое рекомендуемое решение для отслеживания текущего пользователя на сайте с помощью OpenId? Скажем, у меня есть таблица Users с идентификатором и заявленным идентификатором, а затем информация о моем сайте, и пользователь хочет обновить информацию о своем сайте. Как лучше всего отслеживать текущего пользователя, учитывая, что я не использую встроенное членство? Должен ли я отправлять запрос openid для получения ClaimedIdentifier каждый раз, когда пользователь пытается обновить свой профиль? Или, возможно, просто сделайте UserName уникальным и получите информацию о пользователе на основе User.Identity.Name?


person Joe Cartano    schedule 20.04.2011    source источник


Ответы (1)


Я делаю это с помощью файла cookie :) ... мой ответ может оказаться полезным: Какое решение OpenID действительно использует Stack Overflow?

Я также написал об этом простую запись в блоге: http://codesprout.blogspot.com/2011/03/using-dotnetopenauth-to-create-simple.html

public class User
{
    [DisplayName("User ID")]
    public int UserID{ get; set; }

    [Required]
    [DisplayName("Open ID")]
    public string OpenID { get; set; }

    [DisplayName("User Name")]
    public string UserName{ get; set; }
}

В моем примере я вошел в систему с помощью OpenID и сохранил его в файле cookie, но вы можете сохранить в файле cookie другую информацию, например имя пользователя:

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(serName)) throw new ArgumentException("The user name cannot be null or empty.", "UserName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}  

Обновление 2.0:
Как насчет чего-то вроде этого (это представление):

<%
    if (Request.IsAuthenticated) 
    {
        string name = Request.Cookies[Page.User.Identity.Name] == null ? string.Empty : Request.Cookies[Page.User.Identity.Name].Value;
        if (string.IsNullOrEmpty(name))
        {
            name = Page.User.Identity.Name;
        }
%>

        [<%: Html.ActionLink(name, "Profile", "User")%> |
         <%: Html.ActionLink("Log out", "LogOut", "User") %> |
<%
    }
    else 
    {
%> 
        [ <%: Html.ActionLink("Log in", "LogIn", "User") %> |
<%
    }

%>

И Контроллер, предположительно, вы попадаете на страницу Profile после входа в систему (или вы можете установить Response.Cookies в методе LogIn), и когда вы загружаете модель, вы устанавливаете отображаемое имя в файле cookie:

    [Authorize]
    [HttpGet]
    public ActionResult Profile(User model)
    {
        if (User.Identity.IsAuthenticated)
        {
            userRepository.Refresh();
            model = userRepository.FetchByOpenID(User.Identity.Name);

            // If the user wasn't located in the database
            // then add the user to our database of users
            if (model == null)
            {
                model = RegisterNewUser(User.Identity.Name);
            }

            Response.Cookies[model.OpenID].Value = model.DisplayName;
            Response.Cookies[model.OpenID].Expires = DateTime.Now.AddDays(5);

            return View(model);
        }
        else
        {
            return RedirectToAction("LogIn");
        }
    }

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

person Kiril    schedule 20.04.2011
comment
Согласованный. Несмотря на то, что вы не используете членство в ASP.NET, вы можете и должны использовать файл cookie для входа FormsAuthentication, чтобы запомнить, какой пользователь вошел в систему. - person Andrew Arnott; 20.04.2011
comment
@ Андрей, от самого ЧЕЛОВЕКА! Мне кажется, что я что-то делаю правильно :) ... в любом случае, спасибо за то, что подарил нам DotNetOpenAuth: это НАМНОГО упрощает мою жизнь, и, в свою очередь, я внедряю его везде, куда бы я ни пошел! - person Kiril; 20.04.2011
comment
@Lirik, круто, это очень похоже на то, что есть у меня, так что я думаю, что я на правильном пути. Я немного застрял в том, как получить текущего пользователя при попытке обновить информацию его профиля. Имя, которое вы используете для установки файла cookie, является понятным именем, поэтому не может ли быть более одного пользователя с таким понятным именем? Или вы используете заявленный идентификатор, и если да, нужно ли вам использовать состояние сеанса, чтобы получить понятное имя? - person Joe Cartano; 20.04.2011
comment
@Joe, вы можете установить любое понятное имя, какое захотите ... даже если пользователи используют одно и то же понятное имя, они не используют один и тот же файл cookie, поэтому, насколько я понимаю, это не должно быть проблемой. Если ваш сервер зависит от уникальности понятного имени, вы можете указать уникальное понятное имя (т. Е. Использовать UserID вместо UserName). Если вам нужно найти UserName, вы можете найти его в своей базе данных по UserID. - person Kiril; 20.04.2011
comment
@ Лирик, понятно. В идеальном мире я хотел бы иметь возможность быстро отображать понятное имя просто с помощью User.Identity.Name, но затем иметь возможность получать информацию о профиле текущего пользователя, используя заявленный идентификатор или идентификатор пользователя, я полагаю. Я склонялся к тому, чтобы поместить и то, и другое в файл cookie, поскольку это, казалось, единственный способ добиться такого поведения. - person Joe Cartano; 20.04.2011
comment
@ Джо, извини, мне потребовалось время, чтобы ответить тебе ... надо поработать :) ... но я обновил свой ответ конкретным примером, который может тебе помочь. - person Kiril; 21.04.2011
comment
Я бы настоятельно рекомендовал использовать Заявленный идентификатор в качестве имени пользователя, потому что все механизмы безопасности ASP.NET предполагают, что имя пользователя является уникальным значением, которое идентифицирует пользователя. Если это просто понятное имя, то это допускает конфликты и, следовательно, атаки на конфиденциальность пользователей. Один из приемов, который вы можете сделать, - создать свой собственный файл cookie FormsAuth, чтобы он содержал специальное поле, содержащее понятное имя (при этом все еще используется поле имени пользователя для заявленного идентификатора). См. bit.ly/filalh для примера добавления дополнительной строки в файл cookie и bit.ly/eP8V87, чтобы узнать, как его читать. - person Andrew Arnott; 24.04.2011
comment
@Andrew Arnott: будет ли достаточно и уникального UserID, сгенерированного базой данных? Я думаю, что у меня была та же проблема, что и у OP: я был аутентифицирован с заявленным идентификатором, но у меня не было постоянного способа отображения пользовательской информации (например, отображаемого имени). В моем приложении я использую заявленный идентификатор с FormsAuthentication и передаю отображаемое имя в файле cookie ... таким образом я всегда показываю правильное отображаемое имя, и меня всегда идентифицирует уникальный заявленный идентификатор. - person Kiril; 24.04.2011