OpenId更新配置文件信息

时间:2011-04-20 00:20:57

标签: asp.net-mvc openid dotnetopenauth

使用OpenId跟踪站点中当前用户的建议解决方案是什么?假设我有一个带有id和声明的标识符的Users表,然后是我的站点特定信息,并且用户想要更新他们的站点特定信息。鉴于我没有使用内置成员资格,跟踪当前用户的最佳方法是什么?每次用户尝试更新其个人资料时,我是否应该向openid发送请求以获取ClaimedIdentifier?或者只是强制UserName是唯一的,并获取基于User.Identity.Name的用户信息?

1 个答案:

答案 0 :(得分:1)

我是用cookie做的:)...你可能会觉得我的答案很有用:What OpenID solution is really used by 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。我即将发布用户个人资料,您可以更改显示名称(暂时自动生成)。