使用声明标识将用户身份验证到系统中

时间:2016-01-04 10:06:54

标签: c# asp.net-mvc asp.net-mvc-5 owin claims-based-identity

我需要通过声明身份向系统登录用户(借助用户名),以下是我想要实现的目标。

  1. 借助用户名从数据库中获取用户详细信息并创建用户对象。

  2. 将对象传递给CreateIdentityAsync

  3.   

    UserManager.CreateIdentityAsync(用户,DefaultAuthenticationTypes.ApplicationCookie);

    目前,该应用程序已启用多租户。上述方法仅适用于租户Id为空的记录。但是对于tenent id不为null的其他有效记录,它会抛出错误

      

    未找到userId

    来自userManager.CreateIdentityAsync

    所以我尝试创建自定义声明身份并登录系统,如下所示

            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    
            List<Claim> claims = new List<Claim>{
        new Claim(ClaimTypes.GivenName, newUser.Name), //user.Name from my database
        new Claim(ClaimTypes.NameIdentifier, newUser.Id.ToString()), //user.Id from my database
        new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "MyApplicationName"),      
        new Claim(ClaimTypes.Email, newUser.EmailAddress),
        new Claim(ClaimTypes.Surname, newUser.Surname)
    };
            ClaimsIdentity identity = new System.Security.Claims.ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
    
            AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);
    

    由于某种原因,这也失败了。

    任何人都可以帮我解决这个问题。如何通过声明标识将用户登录到系统

1 个答案:

答案 0 :(得分:1)

通过查看Asp.net Identity Framework如何实现声明身份。我能够成功创建自定义声明身份,如下所示。

    string IdentityProviderClaimType =
    "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider";
    string DefaultIdentityProviderClaimValue = "ASP.NET Identity";

    var id = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie, ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
    id.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString(), ClaimValueTypes.String));
    id.AddClaim(new Claim(ClaimsIdentity.DefaultNameClaimType, user.UserName, ClaimValueTypes.String));
    id.AddClaim(new Claim(IdentityProviderClaimType, DefaultIdentityProviderClaimValue, ClaimValueTypes.String));
   //Provide the below if you have any role name 
        id.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType,role.Name , ClaimValueTypes.String));

希望这有助于某人。