我正在使用Asp.Net-Identity-2,我正在尝试使用以下方法验证电子邮件验证码.但我收到"无效令牌"错误消息.
我的应用程序的用户管理器是这样的:
public class AppUserManager : UserManager<AppUser>
{
public AppUserManager(IUserStore<AppUser> store) : base(store) { }
public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
{
AppIdentityDbContext db = context.Get<AppIdentityDbContext>();
AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db));
manager.PasswordValidator = new PasswordValidator {
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = true,
RequireUppercase = true
};
manager.UserValidator = new UserValidator<AppUser>(manager)
{
AllowOnlyAlphanumericUserNames = true,
RequireUniqueEmail = true
};
var dataProtectionProvider = options.DataProtectionProvider;
//token life span is 3 hours …Run Code Online (Sandbox Code Playgroud)我正在使用asp.net MVC和ASP.net Identity 2.0.
在我的网站上管理员可以选择禁止用户,我希望当用户被禁止他自动从网站注销时.
我知道我可以通过电话退出当前用户
AuthenticationManager.SignOut();
Run Code Online (Sandbox Code Playgroud)
但是可以注销另一个用户吗?或者可能缩短他的会话时间 还是什么?
我知道我可以对控制器进行全局过滤,禁止禁止用户访问但是过滤器会针对每个用户运行,所以我对这个解决方案并不满意.
我有一个ASP.NET MVC 5应用程序.我正在使用标准的ASP.NET身份提供程序进行用户和角色管理.重要的是我从自己的存储库项目中使用IdentityUser,但这似乎没问题.我可以注册,登录,编辑用户和管理他们的角色.
我使用以下行将用户添加到Role:
UserManager.AddToRole(userdetail.Id, r);
db.Entry(userdetail).State = EntityState.Modified;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这似乎在DB级别工作.
但是,我不能使用基于角色的身份验证,实际上就是简单
HttpContext.User.IsInRole("Administrator")
Run Code Online (Sandbox Code Playgroud)
不起作用.
[Authorize(Roles="Administrator")]
Run Code Online (Sandbox Code Playgroud)
不起作用.
我只能用这种方法检查用户是否是管理员:
UserManager.IsInRole(userID, "Administrator").
Run Code Online (Sandbox Code Playgroud)
为什么?
在我发现的每个教程中,一切正常.可能是不同的项目存储库?或者ASP.NET身份这么多?
请指教,
当我通过Register操作创建用户时,应用程序用户运行SecurityStamp.当我添加用户时:
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("INSIDE");
var hasher = new PasswordHasher();
try {
var users = new List<ApplicationUser> {
new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl"},
new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4445@wp.pl", UserName = "informatyka4445@wp.pl"}
};
users.ForEach(user => context.Users.AddOrUpdate(user));
context.SaveChanges();
} catch (DbEntityValidationException e) {
System.Diagnostics.Debug.WriteLine("EXC: ");
foreach (DbEntityValidationResult result in e.EntityValidationErrors) {
foreach (DbValidationError error in result.ValidationErrors) {
System.Diagnostics.Debug.WriteLine(error.ErrorMessage);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用户没有获得安全标记:

然后当我想登录时,我得到:

问题:如何SecurityStamp为用户生成?
有没有办法撤销ASP NET Identity 2.0中用户管理器生成的电子邮件验证令牌?
上下文
我想让用户重新发送确认电子邮件.为此,我使用:生成一个新令牌UserManager.GenerateEmailConfirmationTokenAsync(user.Id),并使用新生成的令牌发送电子邮件.不幸的是,当我这样做时,以前生成的令牌仍在工作,有没有办法撤销它们?
示例代码
在UserManager类中:
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(options.DataProtectionProvider.Create("ASP.NET Identity"));
Run Code Online (Sandbox Code Playgroud)
在AccountController中:
var user = await UserManager.FindByEmailAsync("email");
// All generated tokens below will work to confirm the email.
// I only want the last token to be valid when confirming the email address.
var token1 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token2 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token3 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token4 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token5 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var result = await UserManager.ConfirmEmailAsync(user.Id, token5);
Run Code Online (Sandbox Code Playgroud)
还欢迎有关生成的令牌的存储位置以及如何生成这些令牌的信息!
如果您能将此信息发送给我,我将不胜感激.
我发现如果我将用户添加到ASP身份中的角色,它会在我退出并重新登录之后才会生效.我是否需要做一些事情来刷新用户的角色而不强迫用户登录先关掉?
以下是我将用户添加到角色的方式.
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var userId = HttpContext.Current.User.Identity.GetUserId();
userManager.AddToRole(userId, roleName);
Run Code Online (Sandbox Code Playgroud)
然后,几乎立即,我将用户重定向到此操作方法.我可以在数据库中告诉我已经添加到正确的角色,但MVC仍然将我重定向到登录页面.但是,如果我退出,重新登录,并尝试转到此操作方法,它可以正常工作.
[Authorize(Roles = RecoveryStandardRoles.ServiceProvider)]
public partial class CertifyController : Controller
{
#region Public Methods and Operators
public virtual ActionResult CompanyProfile()
{
return this.View();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
感谢您花时间看我的问题!
如何在ASP.NET Core Identity中注销另一个用户(不是当前记录的用户).
我知道有一个SignOutAsync()方法SignInManager,但似乎没有覆盖接受用户作为参数.我正在寻找类似的东西:
signInManager.SignOutAsync(user);
Run Code Online (Sandbox Code Playgroud) 我刚刚将一些应用程序升级到ASP.NET MVC 5.我已经使用ASP.NET Membership几年了,并且正在探索切换到ASP.NET Identity的可能性.
我正在构建一个小的测试应用程序,我已经进行了身份验证(针对活动目录和自定义SQL Server架构,具体取决于用户),甚至通过ClaimsIdentity在签署用户之前添加角色声明进行授权(显然是box Authorize属性实际上将违反所提供的任何索赔信息).
声明默认存储在身份验证cookie中很酷.但是,当有关用户的信息发生更改(即,从角色中添加或删除它们)时,这会产生问题.
显然,我可以Authorize像往常一样完成自己的属性.如果我这样做,我只会一起跳过索赔,只需按照请求检查数据库中的角色.
有没有办法在ASP.NET身份中使用声明并知道它们何时不再有效?框架是否提供了解决此问题的任何选项?
asp.net asp.net-mvc claims-based-identity asp.net-mvc-5 asp.net-identity
那么什么是ASP.NET Identity的IUserSecurityStampStore <TUser>接口?我们了解到ASP.NET Identity具有安全标记功能,用于使用户登录cookie无效,并强制他们重新登录.
在我的MVC应用程序中,管理员可以归档用户.当拱形时,它们应该立即被注销并被迫再次登录(这将因为它们被存档而拒绝它们).
我怎样才能做到这一点?我知道安全标记是关键.默认设置如下所示:
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider {
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
Run Code Online (Sandbox Code Playgroud)
通过实验,如果我将validateInterval设置为1分钟,然后在数据库中手动破解用户安全标记,那么他们将被迫重新登录,但仅在该时间段过去之后.
有没有办法让这个瞬间,或者只是将间隔设置为一个低时间段并等待(或实现我自己的OnValidateIdentity检查每个请求)
谢谢
asp.net authentication asp.net-mvc asp.net-mvc-5 asp.net-identity
首先,我知道这个问题:MVC 5 AddToRole需要在它运行之前注销吗?
而这一个:什么是ASP.NET Identity的IUserSecurityStampStore <TUser>接口?
所以请不要将其标记为副本.
我正在尝试将另一个用户添加到角色中(即我们添加到该角色的用户不是当前用户.如果是,则我链接到的第一个问题的答案就足够了.)
像这样:
IdentityResult result = await userManager.AddToRoleAsync(userID, roleName);
Run Code Online (Sandbox Code Playgroud)
我正在做的两种情况是:从管理页面,当前用户是管理员; 以及基本身份验证保护的webhook(根本没有当前用户).
问题:如果此更改适用的用户已登录并使用该应用程序,我需要立即应用"添加到角色"更改.他们不应该退出并再次进行更改,而且需要立即进行.
感谢大家.
编辑:顺便说一下,User.IsInRole(roleName)要求注销和登录以反映被添加到新角色.UserManager.IsInRole(userID,roleName)没有,因为(我假设)它直接进入数据库表进行检查.但是如果用户点击了一个以他们刚刚添加的角色担保的动作方法,他们仍然需要再次登录,这是公平的.如果有办法解决这个问题仍然很好奇.
编辑:下面是授权属性的源代码:https://github.com/ASP-NET-MVC/aspnetwebstack/blob/4e40cdef9c8a8226685f95ef03b746bc8322aa92/src/System.Web.Mvc/AuthorizeAttribute.cs
它使用User.IsInRole,这本质上是我们需要再次登录的原因.似乎覆盖的方法是AuthorizeCore(HttpContextBase httpContext).我现在不是很勇敢或者不够好,但是如果你想要有很多人会发现这很有帮助.
我有两个与此相关的问题:
1)我需要使用Asp.Net Identity 2将一些远程用户添加/删除后,使invalid.AspNet.ApplicationCookie无效.我尝试使用UpdateSecurityStamp,但由于没有更改密码或用户名,因此SecurityStamp保持不变.当我使用ApplicationRoleManger时,我可以看到用户角色已更新,但在User.Identity声明中,它们保持不变.
2).AspNet.ApplicationCookie验证如何工作以及如何访问它?
我试图使用此代码,但没有任何效果
什么是ASP.NET Identity的IUserSecurityStampStore <TUser>接口?
更新:这是我的Cookie验证设置:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromSeconds(0),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),
OnApplyRedirect = ctx =>
{
if (!IsApiRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
我可以看到user.GenerateUserIdentityAsync(manager)仅在登录时被命中.
我有一个关于ASP.NET身份提供程序的问题.我已经建立了一个系统,您可以对用户和角色执行CRUD操作,但我遇到了问题.如果我要删除已经过身份验证(登录)的用户,他仍然可以在网站上执行操作,因为他仍然在本地计算机上保留身份验证和授权cookie.当用户注销时,他无法再访问该站点.
我的问题: 有没有办法在请求页面时这样做,它会检查用户是否存在于数据库中?另一种方法可能是不存储"角色"cookie并检查(通过数据库)用户是否具有访问页面所需的角色.我不知道如何配置它.任何帮助表示赞赏.
我使用了将用户添加到角色的"AddToRole".但是,此更改无法立即应用,此用户必须注销并登录才能应用.
那么如何立即更新此更改?
谢谢!