Asp.net mvc OpenId更新配置文件信息

Asp.net mvc OpenId更新配置文件信息,asp.net-mvc,openid,dotnetopenauth,Asp.net Mvc,Openid,Dotnetopenauth,使用OpenId跟踪站点中当前用户的推荐解决方案是什么?假设我有一个带有id和声明标识符的用户表,然后是我的站点特定信息,用户希望更新他们的站点特定信息。如果我没有使用内置会员资格,那么跟踪当前用户的最佳方式是什么?每次用户尝试更新其配置文件时,我是否应该向openid发送请求以获取ClaimedIdentifier?或者仅仅强制用户名是唯一的,并根据user.Identity.Name获取用户信息 我是用饼干做的:)。。。你可能会发现我的答案很有用: 我还为此写了一篇简单的博文: 在我的示例中

使用OpenId跟踪站点中当前用户的推荐解决方案是什么?假设我有一个带有id和声明标识符的用户表,然后是我的站点特定信息,用户希望更新他们的站点特定信息。如果我没有使用内置会员资格,那么跟踪当前用户的最佳方式是什么?每次用户尝试更新其配置文件时,我是否应该向openid发送请求以获取ClaimedIdentifier?或者仅仅强制用户名是唯一的,并根据user.Identity.Name获取用户信息

我是用饼干做的:)。。。你可能会发现我的答案很有用:

我还为此写了一篇简单的博文:

在我的示例中,我使用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:
像这样的东西怎么样(这是视图):

你可以在我的一个小项目上看到这一切。我将很快发布一个用户配置文件,您将能够更改显示名称(现在自动生成)。

我使用cookie:)完成此操作。。。你可能会发现我的答案很有用:

我还为此写了一篇简单的博文:

在我的示例中,我使用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:
像这样的东西怎么样(这是视图):


你可以在我的一个小项目上看到这一切。我将很快发布一个用户配置文件,您可以更改显示名称(现在自动生成)。

同意。尽管没有使用ASP.NET成员资格,但您可以而且应该仍然使用FormsAuthentication登录cookie来记住哪个用户登录了。@Andrew,来自该名男子本人!我觉得我在做正确的事情:)。。。不管怎样,谢谢你给我们DotNetOpenAuth:它让我的生活更轻松,作为回报,我在我去的任何地方都在实现它@Lirik,酷,这和我的非常相似,所以我认为我走对了方向。当你试图更新当前用户的个人资料信息时,我有点困惑。您用于设置cookie的名称是友好名称,因此不能有多个用户使用该友好名称吗?或者您是否使用声明的id?如果是,您是否必须使用会话状态才能访问友好名称?@Joe,您可以将友好名称设置为您想要的任何名称。。。即使用户共享相同的友好名称,他们也不会共享相同的cookie,就我所知,这应该不会是一个问题。如果您的服务器依赖于唯一的友好名称,那么您可以强制使用唯一的友好名称(即使用
UserID
而不是
UserName
)。如果您需要查找
用户名
,那么您可以通过
用户名
@Lirik从数据库中查找它,我明白了。在一个完美的世界中,我希望能够简单地使用User.Identity.name快速显示友好的名称,但随后能够使用声明的id或用户id获取当前用户的配置文件信息。我倾向于把两者都放进饼干里,因为这似乎是获得这种行为的唯一途径。同意。尽管没有使用ASP.NET成员资格,但您可以而且应该仍然使用FormsAuthentication登录cookie来记住哪个用户登录了。@Andrew,来自该名男子本人!我觉得我在做正确的事情:)。。。不管怎样,谢谢你给我们DotNetOpenAuth:它让我的生活更轻松,作为回报,我在我去的任何地方都在实现它@Lirik,酷,这和我的非常相似,所以我认为我走对了方向。当你试图更新当前用户的个人资料信息时,我有点困惑。您用于设置cookie的名称是友好名称,因此不能有多个用户使用该友好名称吗?或者您是否使用声明的id?如果是,您是否必须使用会话状态才能访问友好名称?@Joe,您可以将友好名称设置为您想要的任何名称。。。即使用户共享相同的友好名称,他们也不会共享相同的cookie,就我所知,这应该不会是一个问题。如果您的服务器依赖于唯一的友好名称,那么您可以强制使用唯一的友好名称(即使用
UserID
而不是
UserName
)。如果您需要查找
用户名
,那么您可以通过
用户名
@Lirik从数据库中查找它,我明白了。在一个完美的世界中,我希望能够简单地使用User.Identity.name快速显示友好的名称,但随后能够使用声明的id或用户id获取当前用户的配置文件信息。我倾向于把这两种东西都放进饼干里,因为这似乎是获得这种行为的唯一途径。
<%
    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") %> |
<%
    }

%>
    [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");
        }
    }