gpt4 book ai didi

c# - 防伪 token 问题

转载 作者:IT王子 更新时间:2023-10-29 03:34:52 27 4
gpt4 key购买 nike

我在使用防伪 token 时遇到问题 :(我已经创建了自己的 User 类,它运行良好,但现在每当我转到 /Account/Register 页面时都会收到错误消息。错误是:

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-forgerytoken support with claims-based authentication, please verify that theconfigured claims provider is providing both of these claims on theClaimsIdentity instances it generates. If the configured claimsprovider instead uses a different claim type as a unique identifier,it can be configured by setting the static propertyAntiForgeryConfig.UniqueClaimTypeIdentifier.

我找到了这篇文章:

http://stack247.wordpress.com/2013/02/22/antiforgerytoken-a-claim-of-type-nameidentifier-or-identityprovider-was-not-present-on-provided-claimsidentity/

所以我将我的 Application_Start 方法更改为:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Email;
}

但是当我这样做时,我得到了这个错误:

A claim of type'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'was not present on the provided ClaimsIdentity.

有没有人遇到过这个?如果有,你知道怎么解决吗?


这是我的自定义用户类:

public class Profile : User, IProfile
{
public Profile()
: base()
{
this.LastLoginDate = DateTime.UtcNow;
this.DateCreated = DateTime.UtcNow;
}

public Profile(string userName)
: base(userName)
{
this.CreatedBy = this.Id;

this.LastLoginDate = DateTime.UtcNow;
this.DateCreated = DateTime.UtcNow;

this.IsApproved = true;
}

[NotMapped]
public HttpPostedFileBase File { get; set; }

[Required]
public string CompanyId { get; set; }

[Required]
public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }

public DateTime DateCreated { get; set; }
public DateTime? DateModified { get; set; }
public DateTime LastLoginDate { get; set; }

[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredTitle")]
public string Title { get; set; }
[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredFirstName")]
public string Forename { get; set; }
[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredLastName")]
public string Surname { get; set; }

[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredEmail")]
public string Email { get; set; }
public string JobTitle { get; set; }
public string Telephone { get; set; }
public string Mobile { get; set; }
public string Photo { get; set; }
public string LinkedIn { get; set; }
public string Twitter { get; set; }
public string Facebook { get; set; }
public string Google { get; set; }
public string Bio { get; set; }

public string CompanyName { get; set; }

[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredCredentialId")]
public string CredentialId { get; set; }
[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredSecurityCode")]
public bool IsLockedOut { get; set; }
public bool IsApproved { get; set; }

[Display(Name = "Can only edit own assets")]
public bool CanEditOwn { get; set; }
[Display(Name = "Can edit assets")]
public bool CanEdit { get; set; }
[Display(Name = "Can download assets")]
public bool CanDownload { get; set; }
[Display(Name = "Require approval to upload assets")]
public bool RequiresApproval { get; set; }
[Display(Name = "Can approve assets")]
public bool CanApprove { get; set; }
[Display(Name = "Can synchronise assets")]
public bool CanSync { get; set; }

public bool AgreedTerms { get; set; }
public bool Deleted { get; set; }
}

public class ProfileContext : IdentityStoreContext
{
public ProfileContext(DbContext db)
: base(db)
{
this.Users = new UserStore<Profile>(this.DbContext);
}
}

public class ProfileDbContext : IdentityDbContext<Profile, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}

我的资料库很简单,看起来像这样:

public interface IProfile
{
string Id { get; set; }
string CompanyId { get; set; }

string UserName { get; set; }
string Email { get; set; }

string CredentialId { get; set; }
}

User 类是 Microsoft.AspNet.Identity.EntityFramework.User 类。我的 AccountController 看起来像这样:

[Authorize]
public class AccountController : Controller
{
public IdentityStoreManager IdentityStore { get; private set; }
public IdentityAuthenticationManager AuthenticationManager { get; private set; }

public AccountController()
{
this.IdentityStore = new IdentityStoreManager(new ProfileContext(new ProfileDbContext()));
this.AuthenticationManager = new IdentityAuthenticationManager(this.IdentityStore);
}

//
// GET: /Account/Register
[AllowAnonymous]
public ActionResult Register()
{
return View();
}

//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
try
{
// Create a profile, password, and link the local login before signing in the user
var companyId = Guid.NewGuid().ToString();
var user = new Profile(model.UserName)
{
CompanyId = companyId,
Title = model.Title,
Forename = model.Forename,
Surname = model.Surname,
Email = model.Email,
CompanyName = model.CompanyName,
CredentialId = model.CredentialId
};

if (await IdentityStore.CreateLocalUser(user, model.Password))
{
//Create our company
var company = new Skipstone.Web.Models.Company()
{
Id = companyId,
CreatedBy = user.Id,
ModifiedBy = user.Id,
Name = model.CompanyName
};

using (var service = new CompanyService())
{
service.Save(company);
}

await AuthenticationManager.SignIn(HttpContext, user.Id, isPersistent: false);
return RedirectToAction("Setup", new { id = companyId });
}
else
{
ModelState.AddModelError("", "Failed to register user name: " + model.UserName);
}
}
catch (IdentityException e)
{
ModelState.AddModelError("", e.Message);
}
}

// If we got this far, something failed, redisplay form
return View(model);
}

//
// POST: /Account/Setup
public ActionResult Setup(string id)
{
var userId = User.Identity.GetUserId();
using (var service = new CompanyService())
{
var company = service.Get(id);
var profile = new Profile()
{
Id = userId,
CompanyId = id
};

service.Setup(profile);

return View(company);
}
}
}

它曾经用 [ValidateAntiForgeryToken] 属性装饰,但那是它停止工作的地方。

为什么?

最佳答案

尝试设置(在 global.cs 中):

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

关于c# - 防伪 token 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19977833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com