标签: asp.net-identity

Identity 2.0 Code First 表重命名

我正在尝试将身份表重命名为 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)

asp.net asp.net-identity asp.net-identity-2

2
推荐指数
1
解决办法
1605
查看次数

如何实现 IdentityRole (dbo.AspNetRoles) 和自定义实体之间的关系?

我正在处理一个类似于 MVC 模板项目的项目。

我创建了一些我想在数据库中表示的模型。我可以用 DbContext 类创建它们就好了,问题是将我的类的 RoleId 与 ASP.Net Identity 的 Role 表的 id 连接起来。

关于这如何可能的任何想法?

c# asp.net-mvc entity-framework asp.net-identity

2
推荐指数
1
解决办法
1527
查看次数

无法从 GenericIdentity 检索角色

我正在设置一个GenericPrincipal添加GenericIdentity& 角色,但是当我尝试从中检索角色时,我什么也没得到。但是,如果我调用Principal.IsInRole,它会返回正确的值。

我错过了什么?

示例: https : //dotnetfiddle.net/Uan3ru

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)

.net .net-security asp.net-identity

2
推荐指数
1
解决办法
2014
查看次数

刷新后 OWIN 登录验证

我正在尝试使用类似...的内容登录用户。

        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)

和登入工作,但如果我刷新页面,用户通过身份认证,在那里我会希望被注销的用户,因为我同时设置AllowRefreshIsPersistent为false。我错过了一些明显的东西吗?或者也许是一些不明显的东西?(如果它有所作为,则登录的“用户”实际上并不存在,它是一种匿名的经过身份验证的用户)。

c# owin asp.net-identity

2
推荐指数
1
解决办法
3323
查看次数

在 ASP.Net Web Forms (Identity) 中注册后如何防止自动登录?

帐户注册后,用户将自动登录到该站点。如何通过首先向用户发送确认电子邮件,然后在确认帐户后用户可以登录来防止此过程?

基本上,未经确认,任何用户都不得访问该站点。

注册.aspx.cs

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)

c# asp.net webforms asp.net-identity

2
推荐指数
1
解决办法
2219
查看次数

将身份用户传递给服务

我们正在开发一个 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)

下面是使用 …

c# asp.net-mvc asp.net-identity

2
推荐指数
1
解决办法
2763
查看次数

在事务范围内删除用户时超时

  • 背景

我们正在尝试归档旧的用户数据,以使我们最常用的表更小。

  • 问题

    用于删除记录的普通 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

2
推荐指数
1
解决办法
997
查看次数

如果用户已经登录,ASP.NET MVC Identity 如何防止登录?

我已经按照“Pro ASP.NET MVC 5 平台”一书第 13 章到第 15 章中描述的步骤实现了一个用户管理系统。这些章节的代码可以从 Apress 网站http://www 上免费下载。 apress.com/9781430265412。我知道这个问题可能最适合做过相同编码练习的人,但我希望他们和其他人可以帮助我解决这个问题。该系统基于.NET 平台的Identity 框架。我的问题是,对于按照本书的步骤设计的系统,我如何实现以下要求:

如果用户已登录,则不应允许他/她从其他浏览器登录,并应显示适当的消息。此外,即使未单击“注销”按钮,也应将关闭的浏览器视为已注销。实体框架或身份框架中是否有一些机制允许我在登录操作中检查用户当前是否在会话中进行了身份验证?

谢谢你。

.net asp.net authentication asp.net-mvc asp.net-identity

2
推荐指数
1
解决办法
4428
查看次数

如何在登录流程中查找客户端ID

我有一个使用.net核心的Identity Server 4应用程序.一切都很好.我想做的是记录用户登录的客户端,因为我们有许多第三方应用程序,并希望根据应用程序跟踪用户登录.

当用户点击登录表单时,他们会得到以下内容

HTTP://本地主机:5000 /帐户/登录RETURNURL =%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3DClient%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A49000%252Fsignin-OIDC%26response_mode%3Dform_post%26response_type%3Did_token%2520token %2520code%26scope%3Dopenid%2520profile%2520testapi%26state%3DOpenIdConnect.AuthenticationProperties%253DEf4ItTF_eWXPU2OTCYP3CqKsds3ywXrsYSfwxnFQCa-p9LYjfJYPXl6OIJWlKVKAyyN1o_5zeox2Wff5SlXEasQ8r44igT72kaDTzUevTOFwh1pkQyDe9Cwxes3pmFNJJOtet2WRON9XnGkabWtuDYnTbumSqyI4pG_zgb6SsY9A6Fnd-rAPSWFPhsLNVJUXY9PRiw%26nonce%3D636740608058134855.YzdiZmQ2MDYtZmY0Zi00MWZjLTg2NmMtMTIxOGMxMDBlODgxNDZhY2Y1ODQtODNhYi00Yzc4LWIyMDQtYTE2MzhkZWMwYmIy

客户端ID在URL中,虽然一些Identity Server 4中间正在记录,但我可以看到它.我无法弄清楚如何从HttpContext或其他一些我无法找到的变量中获取它.我也检查过signinmanager,似乎也找不到它.

有谁知道我在哪里可以找到用户登录的应用程序的客户端ID?

c# asp.net asp.net-identity asp.net-core identityserver4

2
推荐指数
1
解决办法
718
查看次数

在同一请求中调用PasswordSignIn和SendTwoFactorCode

我想在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

2
推荐指数
1
解决办法
178
查看次数