微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net – 在成功登录时添加声明并在应用程序的其他位置检索它

请求我帮助实现向经过身份验证的用户分配声明的自定义方式.
成功登录后,
var result = await SignInManager.PasswordSignInAsync(model.Email,model.Password,model.RememberMe,shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                //Get the user
                ApplicationUser user = UserManager.FindByEmail(model.Email);
                //Ends here
                ClaimsIdentity identity = await UserManager.CreateIdentityAsync(user,DefaultAuthenticationTypes.ApplicationCookie);
                AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true },identity);

我使用userId从数据存储区中获取有关用户的角色和其他信息.此后,我需要在重定向用户仪表板之前,使用电子邮件,角色,名字,姓氏,性别等信息添加有关用户的声明.
这是我尝试这样做的方式,但问题是即使在登录方法添加声明后,我也无法在_loginPartial剃刀视图中检索它

例如,当我想在登录部分显示电子邮件索赔值时,就像这样

var claims = ClaimsPrincipal.Current.Claims;
    var principal = (ClaimsPrincipal)Thread.CurrentPrincipal;
    var email = principal.Claims.Where(c => c.Type == ClaimTypes.Email).Select(c => c.Value).SingleOrDefault();

它返回null.

因此,我只能在添加它们后使用相同的登录方法访问它们,但我需要能够从应用程序的任何位置访问它.
如果能够在整个申请中的任何其他地方检索这些声明,我将非常感谢.

谢谢.

解决方法

您必须在登录添加您的声明,而不是之后.考虑这个例子:
public async Task<ActionResult> Login(Loginviewmodel model,string returnUrl)
{
    var user = UserManager.Find(model.Email,model.Password);
    if(user!=null)
    {
        var ident = UserManager.CreateIdentity(user,DefaultAuthenticationTypes.ApplicationCookie);
        ident.AddClaims(new[] {
            new Claim("MyClaimName","MyClaimValue"),new Claim("YetAnotherClaim","YetAnotherValue"),});
        AuthenticationManager.SignIn(
            new AuthenticationProperties() { IsPersistent = true },ident);
        return RedirectToLocal(returnUrl);
    }
    ModelState.AddModelError("","Invalid login attempt.");
    return View(model);
}

现在,由于我们在登录时注入了索赔,因此我们可以随时随地访问索赔:

((ClaimsIdentity)User.Identity).FindFirst("MyClaimName");

您还可以在ApplicationUser.GenerateUserIdentityAsync()方法添加声明.通过在此方法添加声明,您可以使用SignInManager.PasswordSignInAsync()方法登录用户,而无需修改认的Login操作方法.

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this,DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        userIdentity .AddClaims(new[] {
            new Claim("MyClaimName",});
        return userIdentity;
    }
}

原文地址:https://www.jb51.cc/aspnet/251894.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐