MVC 5 OWIN de connexion avec les revendications et les AntiforgeryToken. Me manque un ClaimsIdentity fournisseur?
Je suis en train d'apprendre les Réclamations pour MVC 5 OWIN de connexion. J'essaie ed de le garder aussi simple que possible. J'ai commencé avec le modèle MVC et inséré mes revendications code (voir ci-dessous). J'obtiens une erreur lorsque j'utilise le @Html.AntiForgeryToken() helper dans la Vue.
Erreur:
A claim of type 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' or
'http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovid
er' was not present on the provided ClaimsIdentity.
To enable anti-forgery token support with claims-based authentication, please verify that
the configured claims provider is providing both of these claims on the ClaimsIdentity
instances it generates. If the configured claims provider instead uses a different claim
type as a unique identifier, it can be configured by setting the static property
AntiForgeryConfig.UniqueClaimTypeIdentifier.
Exception Details: System.InvalidOperationException: A claim of type
'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' or
'http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider' was
not present on the provided ClaimsIdentity. To enable anti-forgery token
support with claims-based authentication, please verify that the configured claims provider
is providing both of these claims on the ClaimsIdentity instances it generates.
If the configured claims provider instead uses a different claim type as a unique
identifier, it can be configured by setting the static property
AntiForgeryConfig.UniqueClaimTypeIdentifier.
Source Error:
Line 4: using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new
{ id = "logoutForm", @class = "navbar-right" }))
Line 5: {
Line 6: @Html.AntiForgeryToken()
POST action Login
//POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "Brock"),
new Claim(ClaimTypes.Email, "[email protected]")
};
var id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignIn(id);
return RedirectToAction("Welcome");
}
_LoginPartial.cshtml
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-right">
<li>
@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>
}
}
J'ai essayé de réglage ClaimTypes.NameIdentifier
(comme dans cette SORTE de réponse)
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
}
Et puis j'ai "seulement?" reçois cette erreur
A claim of type 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' was
not present on the provided ClaimsIdentity.
Je veux garder la antiforgeryToken, car il peut aider à lutter contre le cross-site scripting.
OriginalL'auteur radbyx | 2015-06-22
Vous devez vous connecter pour publier un commentaire.
Votre demande l'identité n'a pas
ClaimTypes.NameIdentifier
, vous devez ajouter plus dans la revendication tableau:À la carte de l'information à la Demande pour une plus grande correction:
Depuis le nom d'utilisateur est unique aussi, de sorte que vous êtes en mesure d'utiliser
username
pour la lutte anti-contrefaçon en charge du jeton.NameIdentifier
trop mais j'ai reçu le même message d'erreur. Ensuite, j'ai essayé d'ajouter dans le Global.asax.cs sans savoir ce qu'il fait, mais maintenant ça fonctionne. C'est peut-être le même que celui de la cartographie? Mondiale.asax.cs.: AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Nom; AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Email; AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;Le message d'erreur dans la question mentionne
identityprovider
qui n'existe pas comme une constante dansClaimTypes
dans ASP.NET MVC 4.6.1. Il apparaît donc que si @travis-russi paraît convenir le mieux. Dans cette réponse,new Claim(ClaimTypes.NameIdentifier, "userId')
suffirait depuisAntiForgeryConfig.UniqueClaimTypeIdentifier
est fixé àClaimTypes.NameIdentifier
.OriginalL'auteur cuongle
Dans votre
Application_Start()
, de spécifier lesClaim
à utiliser commeNameIdentifier
:Voir: http://brockallen.com/2012/07/08/mvc-4-antiforgerytoken-and-claims/
OriginalL'auteur Travis Russi
AntiForgeryConfig
Un moyen de le résoudre est de mettre en AntiForgeryConfig à utiliser d'autres ClaimType.
Ajouter NameIdentifier et IdentityProvider ClaimTypes
Alternativement, vous pouvez ajouter NameIdentifier et IdentityProvider ClaimTypes à vos demandes.
Voir: https://stack247.wordpress.com/2013/02/22/antiforgerytoken-a-claim-of-type-nameidentifier-or-identityprovider-was-not-present-on-provided-claimsidentity/
OriginalL'auteur Alex N.
J'ai utilisé ce Mondial.asax.cs Application_Start() et résolu l'erreur:
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Nom;
OriginalL'auteur Carlos Escobosa
J'ai eu un problème similaire à ce qui s'est avéré être témoin; j'ai été le développement de deux MVC sites en même temps et parce que ASP.Net les sites utilisent tous le même nom de cookie par défaut, les deux sites ont été interférant les uns avec les autres. Compensation les cookies résolu le problème. Il n'y a plus à ce sujet dans mon réponse ici.
OriginalL'auteur tomRedox