OpenId обновить информацию профиля - PullRequest
1 голос
/ 20 апреля 2011

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

1 Ответ

1 голос
/ 20 апреля 2011

Я делаю это с 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 .В ближайшее время я опубликую профиль пользователя, и вы сможете изменить отображаемое имя (которое создается автоматически).

...