标签: asp.net-identity-2

如何扩展User.Identity的可用属性

我正在使用MVC5 Identity 2.0登录我的网站,其中身份验证详细信息存储在SQL数据库中.Asp.net Identity已经以标准方式实现,可以在许多在线教程中找到.

IdentityModels中的ApplicationUser类已扩展为包含一些自定义属性,例如整数OrganizationId.我们的想法是,可以创建许多用户并将其分配给公共组织以实现数据库关系.

public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }

        //Extended Properties
        public DateTime? BirthDate { get; set; }
        public long? OrganizationId { get; set; }

        //Key Mappings
        [ForeignKey("OrganizationId")]
        public virtual Organization Organization { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

如何从控制器中检索当前登录用户的OrganizationId属性?一旦用户登录,这是否可通过方法获得,或者每次执行控制器方法时,我是否始终根据UserId从数据库中检索OrganizationId?

在网上阅读我看到我需要使用以下内容来登录UserId等.

using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Run Code Online (Sandbox Code Playgroud)

但是,OrganizationId不是User.Identity中可用的属性.我是否需要扩展User.Identity以包含OrganizationId属性?如果是这样,我该怎么做呢.

我经常需要OrganizationId的原因是许多表查询依赖于OrganizationId来检索与登录用户相关联的与组织相关的数据.

asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-identity-2

125
推荐指数
4
解决办法
10万
查看次数

没有注册IUserTokenProvider

我最近更新Asp.Net Identity Core了我的申请表1.0到2.0.

有一些我想尝试的新功能GenerateEmailConfirmationToken,等等.

我正在使用这个项目作为参考.

当用户尝试注册时,我在执行Register方法时遇到错误

private readonly UserManager<ApplicationUser> _userManager;     

public ActionResult Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var ifUserEXists = _userManager.FindByName(model.EmailId);
        if (ifUserEXists == null) return View(model);
        var confirmationToken = _userRepository.CreateConfirmationToken();//this is how i'm generating token currently.                
        var result = _userRepository.CreateUser(model,confirmationToken);
        var user = _userManager.FindByName(model.EmailId);
        if (result)
        {
            var code = _userManager.GenerateEmailConfirmationToken(user.Id);//error here
            _userRepository.SendEmailConfirmation(model.EmailId, model.FirstName, confirmationToken);
            //Information("An email is sent to your email address. Please follow the link to activate your account.");
            return …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-identity-2

98
推荐指数
7
解决办法
4万
查看次数

59
推荐指数
2
解决办法
4万
查看次数

Asp.NET Identity 2给出"无效令牌"错误

我正在使用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)

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

59
推荐指数
7
解决办法
5万
查看次数

使用OAuthBearerTokens与UseOAuthBearerAuthentication

在我们的Startup课程中,我配置了以下auth服务器选项:

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    AllowInsecureHttp = true,
    TokenEndpointPath = new PathString("/api/v1/token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
    Provider = new SimpleAuthorizationServerProvider()
};
Run Code Online (Sandbox Code Playgroud)

在此之后,我们应该使用哪个选项来实际启用承载身份验证?互联网上似乎有两种变体.

选项1:

app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
Run Code Online (Sandbox Code Playgroud)

选项2:

app.UseOAuthBearerTokens(OAuthServerOptions);
Run Code Online (Sandbox Code Playgroud)

我对它们进行了测试,结果是一样的.

这些选项有什么区别?我们什么时候应该使用哪个?

owin katana asp.net-identity asp.net-web-api2 asp.net-identity-2

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

ASP.NET标识更改密码

我需要能够通过管理员更改用户的密码.因此,管理员不应输入用户的当前密码,他应该有能力设置新密码.我查看ChangePasswordAsync方法,但此方法需要输入旧密码.因此,此方法不适合此任务.因此我通过以下方式制作:

    [HttpPost]
    public async Task<ActionResult> ChangePassword(ViewModels.Admin.ChangePasswordViewModel model)
    {
        var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var result = await userManager.RemovePasswordAsync(model.UserId);
        if (result.Succeeded)
        {
            result = await userManager.AddPasswordAsync(model.UserId, model.Password);
            if (result.Succeeded)
            {
                return RedirectToAction("UserList");
            }
            else
            {
                ModelState.AddModelError("", result.Errors.FirstOrDefault());
            }
        }
        else
        {
            ModelState.AddModelError("", result.Errors.FirstOrDefault());
        }
        return View(model);
    }
Run Code Online (Sandbox Code Playgroud)

它有效,但理论上我们可以在AddPasswordAsync方法上收到错误.因此,旧密码将被删除,但未设置新密码.这不好.有什么方法可以在"一次交易"中做到吗?PS.我看到ResetPasswordAsync方法带有重置令牌,似乎,它更安全(因为不能与用户不稳定的情况)但无论如何,它通过2个动作.

c# reset-password asp.net-mvc-5 asp.net-identity-2

49
推荐指数
6
解决办法
6万
查看次数

为什么新的fb api 2.4在带有Identity和oauth 2的MVC 5上返回null电子邮件?

一切都习以为常,直到fb将api升级到2.4 (我以前的项目中有2.3).

今天当我在fb开发人员上添加一个新的应用程序时,我得到了api 2.4.

问题:现在我从fb(loginInfo.email = null)收到空电子邮件.

当然,我检查了用户电子邮件在fb配置文件中处于公共状态,

我去了loginInfo对象,但没有找到任何其他电子邮件地址.

我谷歌,但没有找到任何答案.

请任何帮助..我有点迷路..

谢谢,

我的原始代码(适用于2.3 api):

在AccountController.cs中:

//
// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }
    //A way to get fb details about the log-in user: 
    //var firstNameClaim = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name");  <--worked only on 2.3
    //var firstNameClaim = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:name"); <--works on 2.4 api …
Run Code Online (Sandbox Code Playgroud)

c# facebook facebook-graph-api asp.net-mvc-5 asp.net-identity-2

46
推荐指数
5
解决办法
1万
查看次数

ASP.Net MVC 5 w/identity 2.2.0注销不工作

我在测试ASP.Net MVC 5站点(用于Internet站点)上使用基本登录.

登录工作正常,但当我尝试注销时,它不会发生.注销链接会调用以下控制器操作:

public ActionResult LogOff()
{
    AuthenticationManager.SignOut();
    return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)

但用户仍然保持登录状态.如何确保用户实际登出?

asp.net-mvc logout asp.net-mvc-5 asp.net-identity-2

36
推荐指数
1
解决办法
1万
查看次数

获取asp.net identity 2.0中具有指定角色的用户列表

我有一个列出角色的下拉列表框.我想获得具有该角色的用户列表.我的意思是"管理员"角色或"CanEdit"角色的用户列表.这是我的代码:

public IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> 
  GetRolesToUsers([Control] string ddlRole)
{    
  //ddlRole returns role Id, based on this Id I want to list users

  var _db = new ApplicationDbContext();
  IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> query = _db.Users;

  if (ddlRole != null)
  {
    //query = query.Where(e => e.Claims == ddlRole.Value);  ???????              
  }

  return query;
}
Run Code Online (Sandbox Code Playgroud)

请帮忙.

更新的代码(仍然错误)

public List<IdentityUserRole> GetRolesToUsers([Control]string ddlRole)
{

  var roleManager = 
   new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
  var users = roleManager.FindByName("Administrator").Users.ToList();
  return users;
}
Run Code Online (Sandbox Code Playgroud)

错误:当ItemType设置为"Microsoft.AspNet.Identity.EntityFramework.IdentityUser"时,Select方法必须返回"IQueryable"或"IEnumerable"或"Microsoft.AspNet.Identity.EntityFramework.IdentityUser"之一.

我尝试了各种铸件,但没有一个帮助.

更新(工作解决方案)

感谢chris544,他的想法帮助我解决了这个问题.这是工作方法: -

public List<ApplicationUser> GetRolesToUsers([Control]string ddlRole)
{
  var context = …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc asp.net-mvc-4 asp.net-identity asp.net-identity-2

29
推荐指数
3
解决办法
5万
查看次数

带有自定义表的Identity 2.0

我是ASP.NET身份的新手,我仍然试图了解它是如何工作的.不幸的是,我发现我尝试过的许多教程都是针对Identity 1.0的,而我正在尝试使用Identity 2.0.

我面临的最大问题是我认为很简单,但事实证明并非如此.我要做的是使用现有数据库和现有用户表.目前我所能做的就是让Identity创建自己的表来存储用户数据.我不想使用Entity Framework,但是我很难将Entity Framework与Identity 2.0分开.

虽然我的情况是我正在使用SQL Server,但我想我会尝试在这个链接上实现MySQL的自定义提供程序:http://www.asp.net/identity/overview/extensibility/implementing-a-custom-mysql -aspnet-identity-storage-providerhttps://github.com/raquelsa/AspNet.Identity.MySQL.这似乎只在身份1下工作.似乎有一个较新的,但使用实体框架.我也试过https://github.com/ILMServices/RavenDB.AspNet.Identity.

有了我尝试过的所有东西,我会遇到以下问题:

var manager = new IdentityUserManager(new UserStore<IdentityUser>(context.Get<ApplicationDbContext>()));
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我需要根据RavenDB的说明删除ApplicaitonDbContext类,但是我不知道该放入什么内容.

我得到的错误是:

非泛型类型'AspNet.Identity.MySQL.UserStore'不能与类型参数一起使用

找不到类型或命名空间名称'ApplicationDbContext'(您是否缺少using指令或程序集引用?)

第二个错误是预期的,但是我不确定在这行代码中使用什么.有没有人在没有使用Entity Framework的情况下实现自定义提供程序的经验?

谢谢.

更新1:

我已经尝试了以下教程[ http://aspnetguru.com/customize-authentication-to-your-own-set-of-tables-in-asp-net-mvc-5/ ],但它似乎不完整,完全遵循教程时出现编译或运行时错误.我还有一些问题......

将"ApplicationUser"的所有实例替换为"User"时,IdentityConfig.cs中的以下行出现问题

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<MyDbContext>()));
Run Code Online (Sandbox Code Playgroud)

将ApplicationUser更改为User会产生以下错误

"WebApplicationTest2.Models.User"类型不能在泛型类型或方法"Microsoft.AspNet.Identity.EntityFramework.UserStore"中用作类型参数"TUser".没有从"WebApplicationTest2.Models.User"到"M​​icrosoft.AspNet.Identity.EntityFramework.IdentityUser"的隐式引用转换.

我也很难弄清楚如何使用用户管理器和许多ASync方法.以下行不起作用:

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager));
Run Code Online (Sandbox Code Playgroud)

在AccountController.cs中,出现以下错误:

"Microsoft.Owin.Security.IAuthenticationManager.SignIn(Microsoft.Owin.Security.AuthenticationProperties,params System.Security.Claims.ClaimsIdentity [])'的最佳重载方法匹配具有一些无效参数.

'WebApplicationTest2.Models.User'不包含'GenerateUserIdentityAsync'的定义,并且没有可以找到接受类型'WebApplicationTest2.Models.User'的第一个参数的扩展方法'GenerateUserIdentityAsync'(您是否缺少using指令或程序集引用?)

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

29
推荐指数
1
解决办法
3万
查看次数