我正在尝试将身份表重命名为 Roles、Users、UserRoles、UserLogins 和 UserClaims。我部分成功地执行并使用命令 Update-Table 更新了我的数据库。
但是我似乎无法摆脱 AspNetUsers 表,它总是只生成一列,即 Id 列,尽管我得到了另一个带有完整列列表的 Users 表和另一个 Id 列。
Update-Database 生成的脚本
Applying automatic migration: 201501190035078_AutomaticMigration.
CREATE TABLE [dbo].[Roles] (
[Id] [nvarchar](128) NOT NULL,
[Name] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_dbo.Roles] PRIMARY KEY ([Id])
)
CREATE TABLE [dbo].[UserRoles] (
[UserId] [nvarchar](128) NOT NULL,
[RoleId] [nvarchar](128) NOT NULL,
[IdentityUser_Id] [nvarchar](128),
CONSTRAINT [PK_dbo.UserRoles] PRIMARY KEY ([UserId], [RoleId])
)
CREATE TABLE [dbo].[Users] (
[Id] [nvarchar](128) NOT NULL,
[Email] [nvarchar](max),
[EmailConfirmed] [bit] NOT NULL,
[PasswordHash] [nvarchar](max),
[SecurityStamp] [nvarchar](max),
[PhoneNumber] [nvarchar](max), …Run Code Online (Sandbox Code Playgroud) 我正在处理一个类似于 MVC 模板项目的项目。
我创建了一些我想在数据库中表示的模型。我可以用 DbContext 类创建它们就好了,问题是将我的类的 RoleId 与 ASP.Net Identity 的 Role 表的 id 连接起来。
关于这如何可能的任何想法?
我正在设置一个GenericPrincipal添加GenericIdentity& 角色,但是当我尝试从中检索角色时,我什么也没得到。但是,如果我调用Principal.IsInRole,它会返回正确的值。
我错过了什么?
var identity = new GenericIdentity("Test", "Test");
var pricipal = new GenericPrincipal(identity, new[] { "Role1", "Role2" });
var cls = identity.Claims
.Where(c => c.Type == ClaimTypes.Role)
.Select(c => c.Value);
foreach(var c in cls)
{
Console.WriteLine(c);
}
Console.WriteLine("complete");
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用类似...的内容登录用户。
var accessor = HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
var result = await accessor.CreateUserIdentityAsync(new User() { ... });
AuthenticationManager.SignIn(
new AuthenticationProperties { AllowRefresh = false, IsPersistent = false },
result);
Run Code Online (Sandbox Code Playgroud)
和登入工作,但如果我刷新页面,用户通过身份认证,在那里我会希望被注销的用户,因为我同时设置AllowRefresh并IsPersistent为false。我错过了一些明显的东西吗?或者也许是一些不明显的东西?(如果它有所作为,则登录的“用户”实际上并不存在,它是一种匿名的经过身份验证的用户)。
帐户注册后,用户将自动登录到该站点。如何通过首先向用户发送确认电子邮件,然后在确认帐户后用户可以登录来防止此过程?
基本上,未经确认,任何用户都不得访问该站点。
namespace Web_WebApp.Account
{
public partial class Register : Page
{
protected void CreateUser_Click(object sender, EventArgs e)
{
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>();
//var user = new ApplicationUser() { UserName = UserName.Text, Email = Email.Text, FirstName = FirstName.Text, MiddleName = MiddleName.Text, LastName = LastName.Text, RegistrationDate = DateTime.Now };
var user = new ApplicationUser()
{
UserName = UserName.Text,
Email = Email.Text,
FirstName = FirstName.Text,
MiddleName = MiddleName.Text,
LastName = LastName.Text,
RegistrationDate = DateTime.Now,
};
IdentityResult result …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个 Web 应用程序,用户可以在其中注册订单、客户等,然后进行查看。我们有 MVC 控制器使用的服务,以便与 Web UI 交互。
现在我们面临多个用户的问题:每个服务都应该提供当前授权的用户 ID,所以所有操作(CRUD 和业务逻辑)都将只允许该用户 ID。应该怎么通过?
我正在考虑将一个参数传递给我的IDataService(服务的基类),该参数由 实例化WhateverController,后者又可以访问该User.Identity.GetUserId()方法,但是当我使用 IoC 容器(Ninject)时,我不知道如何去做。我想这IDataService需要对 a 的引用IUserInfoProvider,因此它可以调用IUserInfoProvider.GetUserId(). 然后我可以以某种方式注入一个基于 Identity 的实现并拥有当前的 Web 上下文信息,几乎与必须实例化控制器的方式相同。
问题是:如何获取这些数据?
当然,一个更简单的解决方案是在每个 Controller 构造函数中手动完成,但应该有更自动和更优雅的方法来解决这个问题。
编辑:经过更多的研究,感谢 Cuong Le 的回答,我不得不问的问题实际上是“如何从当前上下文注入 UserManager?”。
但是,为了将我的服务层与 MVC 分离,我创建了一个IUserInfoProvider,它提供对经过身份验证的用户数据的访问。基于 Identity 和 UserManager 的实现位于 Web UI (MVC) 项目中,因此它具有IPrincipalCuong Le 的建议,以及ApplicationUserManager,,都使用 Ninject 注入。
以下接口从 Identity 和 UserManager 中抽象出用户信息。
public interface IUserInfoProvider<T>
{
string GetUserId();
T GetUserData();
}
Run Code Online (Sandbox Code Playgroud)
下面是使用 …
我们正在尝试归档旧的用户数据,以使我们最常用的表更小。
问题
用于删除记录的普通 EF 代码适用于我们的自定义表。AspNetUsers 表是另一回事。看来这样做的方法是使用_userManager.Delete或_userManager.DeleteAsync。这些工作无需尝试在一个事务中进行多个数据库调用。当我将其包装在 transactionScope 中时,它会超时。下面是一个例子:
public bool DeleteByMultipleIds(List<string> idsToRemove)
{
try
{
using (var scope = new TransactionScope())
{
foreach (var id in idsToRemove)
{
var user = _userManager.FindById(id);
//copy user data to archive table
_userManager.Delete(user);//causes timeout
}
scope.Complete();
}
return true;
}
catch (TransactionAbortedException e)
{
Logger.Publish(e);
return false;
}
catch (Exception e)
{
Logger.Publish(e);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)请注意,在代码运行时,我直接调用数据库,例如:
DELETE
FROM ASPNETUSERS
WHERE Id = 'X'
Run Code Online (Sandbox Code Playgroud)
它也会超时。此 SQL 在执行 C# …
c# asp.net-mvc entity-framework transactionscope asp.net-identity
我已经按照“Pro ASP.NET MVC 5 平台”一书第 13 章到第 15 章中描述的步骤实现了一个用户管理系统。这些章节的代码可以从 Apress 网站http://www 上免费下载。 apress.com/9781430265412。我知道这个问题可能最适合做过相同编码练习的人,但我希望他们和其他人可以帮助我解决这个问题。该系统基于.NET 平台的Identity 框架。我的问题是,对于按照本书的步骤设计的系统,我如何实现以下要求:
如果用户已登录,则不应允许他/她从其他浏览器登录,并应显示适当的消息。此外,即使未单击“注销”按钮,也应将关闭的浏览器视为已注销。实体框架或身份框架中是否有一些机制允许我在登录操作中检查用户当前是否在会话中进行了身份验证?
谢谢你。
我有一个使用.net核心的Identity Server 4应用程序.一切都很好.我想做的是记录用户登录的客户端,因为我们有许多第三方应用程序,并希望根据应用程序跟踪用户登录.
当用户点击登录表单时,他们会得到以下内容
客户端ID在URL中,虽然一些Identity Server 4中间正在记录,但我可以看到它.我无法弄清楚如何从HttpContext或其他一些我无法找到的变量中获取它.我也检查过signinmanager,似乎也找不到它.
有谁知道我在哪里可以找到用户登录的应用程序的客户端ID?
我想在asp.net mvc中实现以下用于双因素身份验证的流程:
var res = sign.PasswordSignIn("myusername", "mypassword", false, false);
if(res == SignInStatus.RequiresVerification)
sign.SendTwoFactorCode("EmailCode");
Run Code Online (Sandbox Code Playgroud)
但是我发现该SendTwoFactorCode函数返回false并且没有发送电子邮件,因为它在内部检查用户是否已经过验证. 在源代码中查看此行. 如果我发出第二个请求,那电话SendTwoFactorCode就像我期待的那样工作.
有没有办法SendTwoFactorCode在打电话后立即正常工作PasswordSignIn?
asp.net asp.net-mvc two-factor-authentication asp.net-mvc-4 asp.net-identity
asp.net-identity ×10
c# ×6
asp.net ×5
asp.net-mvc ×5
.net ×2
asp.net-core ×1
owin ×1
webforms ×1