【问题标题】:A claim of type 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' was not present on the provided ClaimsIdentity提供的 ClaimsIdentity 上不存在“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier”类型的声明
【发布时间】:2017-02-17 07:04:38
【问题描述】:

我在 login 中使用声明。但它告诉我这个错误

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier 类型的声明在提供的 ClaimsIdentity 中不存在。

如何解决这个问题?

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        //AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Email;
        AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
    }
}

.

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{

    if (!ModelState.IsValid)
    {
        return View(model);
    }

    var identity =new  ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.Email) }, DefaultAuthenticationTypes.ApplicationCookie,
        ClaimTypes.Name, ClaimTypes.Role);
    identity.AddClaim(new Claim(ClaimTypes.Name, model.Email));
    identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
    identity.AddClaim(new Claim(ClaimTypes.Sid, "123"));
    AuthenticationManager.SignIn(new AuthenticationProperties
    {
        IsPersistent = model.RememberMe
    }, identity);
    return RedirectToLocal(returnUrl);
}

更新

【问题讨论】:

  • 您在Application_Start 中有ClaimTypes.NameIdentifier,但在您的Login 中使用ClaimTypes.Name

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


【解决方案1】:

您在Application_Start 中有ClaimTypes.NameIdentifier,但在您的Login 中使用ClaimTypes.Name

您需要更改其中一个或另一个,以使其符合预期。

protected void Application_Start() {
    //...other code omitted for brevity
    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;
}

您还应该确保您没有重复声明,因为这会破坏您视图中的 AntiForgeryToken 调用。

这里提到MVC5 AntiForgeryToken Claims/“Sequence contains more than one element”

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) {

    if (!ModelState.IsValid) {
        return View(model);
    }

    var identity = new  ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
    identity.AddClaim(new Claim(ClaimTypes.Name, model.Email));
    identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
    identity.AddClaim(new Claim(ClaimTypes.Sid, "123"));
    AuthenticationManager.SignIn(new AuthenticationProperties {
        IsPersistent = model.RememberMe
    }, identity);
    return RedirectToLocal(returnUrl);
}

【讨论】:

  • 我这样做。但是告诉我这个错误Sequence contains more than one matching element
  • 因为您不止一次添加了ClaimTypes.Name。一次在构造函数中,再次在以下行中
  • 构造函数:var identity =new ClaimsIdentity(new[] { **new Claim(ClaimTypes.Name, model.Email)** } 并在下一行再次出现identity.AddClaim(**new Claim(ClaimTypes.Name, model.Email**))
  • 我评论 identity.AddClaim(**new Claim(ClaimTypes.Name, model.Email**)) 直到告诉我那个错误
最近更新 更多