Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 修改后使ClaimsPrincipal无效_Asp.net Mvc_Asp.net Mvc 4_Claims Based Identity_Asp.net Identity 2 - Fatal编程技术网

Asp.net mvc 修改后使ClaimsPrincipal无效

Asp.net mvc 修改后使ClaimsPrincipal无效,asp.net-mvc,asp.net-mvc-4,claims-based-identity,asp.net-identity-2,Asp.net Mvc,Asp.net Mvc 4,Claims Based Identity,Asp.net Identity 2,我正在使用ASP.NET MVC,Identity2 我添加了“FirstName”自定义clainprincipal: public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, long> manager) { var userIdentity = await manager.CreateIdentityAsync(

我正在使用ASP.NET MVC,Identity2

我添加了“FirstName”自定义
clainprincipal

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, long> manager)
{
    var userIdentity = await manager.CreateIdentityAsync(
                           this,
                           DefaultAuthenticationTypes.ApplicationCookie);

    // Add custom user claims here
    userIdentity.AddClaim(new Claim("FirstName", FirstName));

    return userIdentity;
}

public async Task GenerateUserIdentityAsync(UserManager,它显示了如何更新声明的值,我想知道是否有更简单的方法使它们失效。

当查看MS内置模板时,我注意到它们在更改用户凭据后总是调用
SignInManager.SignInAsync
(例如密码、双因素认证等)

我还注意到,一旦用户注销并重新登录,
声明就会更新……因此,在更改存储在
声明
中的“FirstName”后,我调用了
SignInManager.SignInAsync来重新登录用户……这样,
声明
就会更新:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> UpdateFirstName(string firstName)
{
    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<long>());
    user.FirstName = firstName;

    // update FirstName which is stored in a Claim
    var result = await UserManager.UpdateAsync(user);

    if (result.Succeeded)
    {
        // re-signin the user, to refresh the Claims
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

        // you need to redirect after calling SignInAsync, so claims are refreshed
        return RedirectToAction("Index"); 
    }

    // add some error message...
    return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务UpdateFirstName(字符串名)
{
var user=await UserManager.FindByIdAsync(user.Identity.GetUserId());
user.FirstName=FirstName;
//更新索赔中存储的FirstName
var result=await UserManager.UpdateAsync(用户);
if(result.successed)
{
//重新登录用户,以刷新声明
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
//您需要在调用SignInAsync后重定向,以便刷新声明
返回操作(“索引”);
}
//添加一些错误消息。。。
返回视图();
}

注意:如问题所示,我将
声明存储在Cookie中。

查看MS内置模板时,我注意到他们总是在更改用户凭据(例如密码、双因素身份验证等)后调用
SignInManager.SignInAsync

我还注意到,一旦用户注销并重新登录,
声明就会更新……因此,在更改存储在
声明
中的“FirstName”后,我调用了
SignInManager.SignInAsync来重新登录用户……这样,
声明
就会更新:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> UpdateFirstName(string firstName)
{
    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<long>());
    user.FirstName = firstName;

    // update FirstName which is stored in a Claim
    var result = await UserManager.UpdateAsync(user);

    if (result.Succeeded)
    {
        // re-signin the user, to refresh the Claims
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

        // you need to redirect after calling SignInAsync, so claims are refreshed
        return RedirectToAction("Index"); 
    }

    // add some error message...
    return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务UpdateFirstName(字符串名)
{
var user=await UserManager.FindByIdAsync(user.Identity.GetUserId());
user.FirstName=FirstName;
//更新索赔中存储的FirstName
var result=await UserManager.UpdateAsync(用户);
if(result.successed)
{
//重新登录用户,以刷新声明
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
//您需要在调用SignInAsync后重定向,以便刷新声明
返回操作(“索引”);
}
//添加一些错误消息。。。
返回视图();
}

注意:如问题所示,我正在Cookie中存储
声明

技术解决方案取决于您的设置。如果您正在Cookie中存储信息,则需要更新Cookie。如果您使用的是访问令牌,则需要等待它过期或使用新的访问令牌(例如使用refres)替换它h token。逻辑解决方案是不包括经常更改或可以通过其他方式确定的声明。您可以设置UserInfo端点,在该端点中您可以请求当前的名字和有关用户的其他信息。但您也可以将其作为业务上下文的一部分,例如询问名字是什么。感谢@RuardvanElburg的解释声明。我使用Cookie,之所以将FirstName和LastName存储为声明,是因为我希望它们存储在Cookie中…我认为从Cookie中读取它们会比从DB中读取用户对象更快。FirstName和LastName不会经常更改…您认为,将它们保留为声明是明智的解决方案吗?它始终取决于nds取决于您的设计,但这是肯定的。可以使用诸如FirstName、LastName之类的声明。特别是当您希望在每个页面上显示它们时。这可能会更快,但我怀疑您是否能够实际测量差异。还有其他提高性能的方法,如缓存。技术解决方案取决于您的设置。如果您正在存储信息在cookie中单击“刷新”,则您需要更新cookie。如果您使用的是访问令牌,则您需要等待它过期,或者使用新的访问令牌(例如,使用刷新令牌)替换它。逻辑解决方案是不包括经常更改或可以通过其他方式确定的声明。您可以设置一个UserInfo终结点,在该终结点中可以查询用户的当前名字和其他信息。但你也可以将其作为业务上下文的一部分,比如询问名字是什么。感谢@RuardvanElburg的解释。我使用Cookie,我之所以将名字和姓氏存储为声明,是因为我希望它们存储在Cookie中……我想从cookie会比从数据库读取用户对象更快。FirstName和LastName不会经常更改…您认为,将它们保留为声明是一个明智的解决方案吗?这始终取决于您的设计,但确实如此。可以使用像FirstName、LastName这样的声明。特别是当您希望在每个页面上显示它们时。这可能会更快,但我怀疑您可以实际测量差异。还有其他提高性能的方法,如缓存。