我正在使用 Asp.net身份进行登录,注册,忘记密码等,并且源代码来自以下链接:

http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-web-app-with-email-confirmation-and-password-reset

http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity

现在我有1个表是UserMaster,在注册过程中,我要求以下字段:
全名,EmailId,密码,ContactNumber,性别

我的UserMaster包含以下字段: Id,FullName,EmailId,ContactNumber,性别

现在,当用户提交注册表单时,此FullName,EmailId,ContactNumber,Gender将与电子邮件一起保存在 UserMaster 中,密码将保存在AspnetUser 中。

我的注册方法与上述2个链接中提供的相同。

在这里您可能会注意到,我的UserMaster和AspnetUser 之间没有,所以在登录过程中,当用户输入其电子邮件ID进行登录时,我将使用await SignInManager.PasswordSignInAsync这个方法来验证用户,如果该方法返回成功,则我将使用此电子邮件ID,并在UserMaster中检查此电子邮件,在哪里找到匹配项,我将从UserMaster中获取该UserId并将其存储在 session 中,并在我的登录方法中使用我的应用程序,如下所示:

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
            {
                if (!ModelState.IsValid)
                {
                    return View(model);
                }

                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, change to shouldLockout: true
                var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
                switch (result)
                {
                    case SignInStatus.Success:
                  using (var context = new MyEntities())
                        {
                            var fetchUSerId = context.UserMaster.Where(t => t.Email == model.Email).Select(t=>t.UserId).SingleOrDefault();
                            Session["UserId"] = fetchUSerId;
                        }
                        return RedirectToLocal(returnUrl);
                    case SignInStatus.LockedOut:
                        return View("Lockout");
                    case SignInStatus.RequiresVerification:
                        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                    case SignInStatus.Failure:
                    default:
                        ModelState.AddModelError("", "Invalid login attempt.");
                        return View(model);
                }
            }

我在我的登录方法中谈论这个:
 case SignInStatus.Success:
                      using (var context = new MyEntities())
                            {
                                var fetchUSerId = context.UserMaster.Where(t => t.Email == model.Email).Select(t=>t.UserId).SingleOrDefault();
                                Session["UserId"] = fetchUSerId;
                            }

这是一种合适的方法还是一种更好的方法,我想存储整个用户对象,而不仅仅是存储用户ID。

那么有人可以告诉我如何使用aspnet身份吗?

最佳答案

由于您正在使用Asp.Net Identity,因此您希望将与 session 相关的内容存储为声明。这很容易扩展自定义声明。

顺便说一句,我认为您最好通过简单地扩展ApplicationUser来保存其他数据(如here详细信息)。

就是说,这是如何向您的应用程序添加自定义声明类型的完整示例。

步骤1 -定义一种或多种自定义声明类型以保存您的其他信息

public static class CustomClaimTypes
{
    public const string MasterFullName = "http://schemas.xmlsoap.org/ws/2014/03/mystuff/claims/masterfullname";
    public const string MasterUserId = "http://schemas.xmlsoap.org/ws/2014/03/mystuff/claims/masteruserid";
}

声明类型只是标识特定声明的唯一字符串。在这里,我们只是使用与内置声明类型相似的格式。

步骤2 -在登录过程中,为自定义声明类型设置值
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

    //Fetch data from the UserMaster table
    var userdata = GetdatafromUserMaster();

    //Using the UserMaster data, set our custom claim types
    identity.AddClaim(new Claim(CustomClaimTypes.MasterUserId, userdata.UserId));
    identity.AddClaim(new Claim(CustomClaimTypes.MasterFullName, userdata.FullName));

    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

注意:我们正在使用自定义声明类型,以便保留现有的NameIdentifierName声明,因此可以轻松地从自定义UserMaster表的Asp.Net Identity 访问身份信息。

步骤3 -向IIdentity添加扩展方法,以便我们可以轻松访问我们的自定义声明数据
public static class IdentityExtensions
{
    public static string GetMasterUserId(this IIdentity identity)
    {
        if (identity == null)
            return null;

        return (identity as ClaimsIdentity).FirstOrNull(CustomClaimTypes.MasterUserId);
    }

    public static string GetMasterFullName(this IIdentity identity)
    {
        if (identity == null)
            return null;

        return (identity as ClaimsIdentity).FirstOrNull(CustomClaimTypes.MasterFullName);
    }

    internal static string FirstOrNull(this ClaimsIdentity identity, string claimType)
    {
        var val = identity.FindFirst(claimType);

        return val == null ? null : val.Value;
    }
}

这里没什么好看的。我们只是将IIdentity转换为ClaimsIdentity,然后返回找到的给定CustomClaimType的第一个声明的值,或者如果声明不存在,则返回null

步骤4 -现在,我们可以非常轻松地在 View 和/或 Controller 中访问我们的自定义声明数据。假设您要使用UserMaster表中的全名而不是ApplicationUser?您现在可以执行以下操作:
<ul class="nav navbar-nav navbar-right">
    <li>
        @Html.ActionLink("Hello " + User.Identity.GetMasterFullName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
    </li>
    <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>

您也可以在Controller内部执行相同的操作。

关于c# - 如何在aspnet身份中进行 session 管理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32880269/

10-09 23:45