- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 Asp.net 身份 进行登录、注册、忘记密码 等操作,源代码取自以下链接:
现在我有 1 个 UserMaster 表,在注册期间我要求输入以下字段:全名、电子邮件 ID、密码、联系电话、性别。
我的 UserMaster 包含以下字段:Id,FullName,EmailId,ContactNumber,Gender
现在,当用户提交注册表时,此 FullName、EmailId、ContactNumber、Gender 将与 Email、Password 一起保存在 UserMaster 中。
我的注册方法与上面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
声明,因此可以轻松地从 Asp.Net Identity < strong>和我们的自定义 UserMaster
表。
第 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/
我将 aspnetboilerplate/aspnetzero 模板用于具有多数据库的 Multi-Tenancy SaaS 应用程序。这使用 CaSTLeWindsor 作为 DI 框架。 我遇到了
在我的应用程序中,我安装了以下两个 nuget 包: Microsoft.AspNet.Cors - 5.2.2 Microsoft.AspNet.WebApi.Cors - 5.2.2 我的应用程序
我有一个 aspnet core web api 项目,可以通过发布向导将其部署到 Azure 应用服务。但后来我在普通的 aspnet web api(.Net Framework 4.6 上的 M
2015 年 11 月 20 日更新 如何针对使用旧成员(member)提供程序存储用户的数据库进行身份验证? (aspnet_* 表)知道这个数据库被其他应用程序使用,所以我没有迁移(或更改)数据库
我正在使用最新的 VS2015 社区和 ASP.NET 5 等构建 AngularJS 单页应用程序... 我现在在尝试实现身份验证时遇到的问题是我需要使用这两个命名空间: Microsoft.Asp
这两个库有什么区别: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization/1.1.0 https://www.nuget.
如果我使用安装的 Nuget 包 Microsoft.AspNet.FriendlyUrls v 1.0.2 和 Microsoft.AspNet.Identity v.1.0.0. 从 jQuery
我们在 ASP.NET 5 中进行身份验证时遇到了麻烦。In this security sample ,我们看到了这种东西: app.Run(async context => { va
背景:我们正在进行的项目包含多个共享两个库的解决方案。今天一切都是用 .NET Framework 4.6.1 编写的。该项目的目标是为新项目采用 .NET Core 并能够在 Docker 中运行
我正在使用带有 OData 端点的 Web API 和 Entity Framework 创建一个 RESTful 服务。 Microsoft.AspNet.WebApi.OData 和 Micros
在 VS 2015 中,升级 NuGet 包后,我收到以下警告: Dependency specified was Microsoft.AspNet.Mvc >= 6.0.0-beta6 but en
作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本。
研究身份提供者的概念证明,需要帮助理解 aspnet 身份的一些细微差别,特别是与用户声明相关的。 我想要完成的事情: 1) 公开一个 MVC 应用程序,该应用程序提供对 2 个微服务之一的安全访问,
我正在尝试使用一些非常标准的算法来解密字符串。 public static string DecryptString(string cipherText) { string keyString
我知道这取决于项目,但我想了解典型的 asp.net 核心项目是否有通用做法(例如忽略 node_modules)。 最佳答案 截至 2020 年,您应该使用 dotnet new gitignore
1. 加入dll文件这是必须的。 2.拖入控件到应用位置,添加引用: 引用: <%@ Register Assembly="AspNetPage
为什么 mvc 5 中包含身份验证过滤器? mvc 5 中的身份验证过滤器和授权过滤器之间的主要区别是什么? 最佳答案 我找到了以下博文:ASP.NET MVC 5 Authentication Fi
我正在尝试遵循一些过时的 AspNet Core 1.1 教程项目 (虽然我使用的是 Visual Studio 2019 预览版 2.0, 和 .net core v3.0.0-preview9 安
如果我使用本地 Web 服务器进行开发,我可以在不安装 IIS 的情况下从命令行使用实用程序 aspnet_compiler 编译网站项目 (3.5) 吗? 谢谢 最佳答案 是的你可以。您必须指定将在
我有一个.NET Core 2 Web应用程序,并且我想使用ASP.NET Identity来验证我的用户。在.NET Core 1.x上,我的代码运行正常。 我迁移到.NET Core 2,并且在V
我是一名优秀的程序员,十分优秀!