我正在使用 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);
}
注意:我们正在使用自定义声明类型,以便保留现有的
NameIdentifier
和Name
声明,因此可以轻松地从自定义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/