Problema: AntiForgeryToken: A Claim of Type NameIdentifier or IdentityProvider Was Not Present on Provided ClaimsIdentity
Muitas vezes os usuários não saem apropriadamente do sistema ou acabam clicando no botão voltar do navegador. Ao tentar logar novamente o sistema acaba lançando exceção por já haver na lista de claims os dados do usuário autenticado.
Para sanar este caso você pode na classe Application_Start adicionar AntiForgeryConfig.UniqueClaimTypeIdentifier
1 2 3 4 5 6 7 8 | protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; } |
Ao autenticar o usuario e adicionar os Claims você pode adicionar os parâmetros nameidenfier e identityprovider com os dados de seu usuário obtido em base de dados assim:
1 2 3 4 5 6 7 8 9 10 11 | List<Claim> _claims = new List<Claim>(); _claims.AddRange(new List<Claim> { new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", _user.Name)), new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", _user.Name) }) |
Em filter config adicionar:
1 2 3 4 5 6 | public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new HandleAntiforgeryTokenErrorAttribute() { ExceptionType = typeof(HttpAntiForgeryException) } ); } } |
1 2 3 4 5 6 7 8 | public class HandleAntiforgeryTokenErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { filterContext.ExceptionHandled = true; filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "Login", controller = "Account" })); } } |
Pronto.
Os problemas foram solucionados :)
Comentários
Postar um comentário