我在 VS 2015 中使用带有 MVC 4 的Auth0-Mvc NuGet 包(最新 0.9.1)。针对 .NET 4.5.2
在部分视图中指定 a@Html.AntiForgeryToken()
时,我遇到了
“ http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier ”或“ http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider ”类型的声明是不存在于提供的 ClaimsIdentity 上。要启用基于声明的身份验证的防伪令牌支持,请验证配置的声明提供程序是否在其生成的 ClaimsIdentity 实例上提供这两个声明。如果配置的声明提供程序使用不同的声明类型作为唯一标识符,则可以通过设置静态属性 AntiForgeryConfig.UniqueClaimTypeIdentifier 进行配置。
使用其他类似问题的建议,我修改Global.asax.cs
为包括:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
}
这将导致:
提供的 ClaimsIdentity 上不存在类型为“ http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier ”的声明。
如何修改我的代码以解决此 ClaimsIdentity 和 nameidentifier 问题?
我检查了 MVC 4 示例遇到了无法解决的运行时错误,并且它的源代码没有在社区中发现任何修改。它确实有@Html.AntiForgeryToken()
,所以我希望有一个解决方案。
我CallbackHandler.ashx
的与 NuGet 包 0.9.1 中提供的相同
public void ProcessRequest(HttpContext context)
{
var token = client.ExchangeAuthorizationCodePerAccessToken(context.Request.QueryString["code"], ConfigurationManager.AppSettings["auth0:CallbackUrl"]);
var profile = client.GetUserInfo(token.AccessToken);
var user = new Dictionary<string, string>
{
{ "name", profile.Name??"" },
{ "email", profile.Email??"" },
{ "family_name", profile.FamilyName??"" },
{ "given_name", profile.GivenName??"" },
{ "gender", profile.Gender??"" },
{ "nickname", profile.Nickname??"" },
{ "picture", profile.Picture??"" },
{ "user_id", profile.UserId??"" },
{ "id_token", token.IdToken }
};
ClaimsCookie.ClaimsCookieModule.Instance.CreateSessionSecurityToken(user);
var claimedUser = new User
{
AccessToken = user["id_token"],
UserID = user["user_id"],
Name = user["name"],
Email = user["email"],
NickName = user["nickname"],
ProfilePicUrl = user["picture"]
};
//go save to database.
//then redirect to another URL