2017-05-16 28 views
0

我需要在用户登录后更新web api中的用户声明。 但更新用户声明后,它仍然会返回以前的值。 波纹管代码中使用的用户登录后,更新活跃用户组。用户声明更新不受ASP.NET身份影响?

/// <summary> 
/// The class AppUser 
/// </summary> 
public class AppUser : ClaimsPrincipal 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="AppUser"/> class. 
    /// </summary> 
    /// <param name="principal">The principal.</param> 
    public AppUser(ClaimsPrincipal principal) 
     : base(principal) 
    { 
    } 

    /// <summary> 
    /// Gets the name. 
    /// </summary> 
    /// <value> 
    /// The name. 
    /// </value> 
    public string Name 
    { 
     get 
     { 
      return this.FindFirst(ClaimTypes.Name).Value; 
     } 
    } 

    /// <summary> 
    /// Gets the name of the user. 
    /// </summary> 
    /// <value> 
    /// The name of the user. 
    /// </value> 
    public string UserName 
    { 
     get 
     { 
      return this.FindFirst("UserName").Value; 
     } 
    } 

    /// <summary> 
    /// Gets the active group. 
    /// </summary> 
    /// <value> 
    /// The active group. 
    /// </value> 
    public string ActiveGroup 
    { 
     get 
     { 
      return ((ClaimsIdentity)this.Identity).FindFirst("ActiveGroup").Value; 
     } 
    } 

    /// <summary> 
    /// Gets the email. 
    /// </summary> 
    /// <value> 
    /// The email. 
    /// </value> 
    public string Email 
    { 
     get 
     { 
      return this.FindFirst("Email").Value; 
     } 
    } 
} 


/// <summary> 
/// The class BaseController 
/// </summary> 
public class BaseController : ApiController 
{ 
    /// <summary> 
    /// Gets the current user. 
    /// </summary> 
    /// <value> 
    /// The current user. 
    /// </value> 
    public AppUser CurrentUser 
    { 
     get 
     { 
      return new AppUser(this.User as ClaimsPrincipal); 
     } 
    } 
} 



public class AccountController : BaseController 
{ 

    [HttpPost] 
    [Route("UpdateUserGroup")] 
    public int UpdateUserGroup(string userGroup) 
    { 
     var user = User as ClaimsPrincipal; 
     var identity = user.Identity as ClaimsIdentity; 
     identity.RemoveClaim(identity.FindFirst("ActiveGroup")); 
     identity.AddClaim(new Claim("ActiveGroup", this.GetRoleNameByPresenter(userGroup))); 
     return 1; 
    } 
} 

回答

1

的问题是,权利要求书在认证过程中使用,并且所述认证令牌/饼干的一部分。如果你想从当前用户移除一个声明,那么你需要确保客户端得到一个新的令牌/ cookie。

如果你正在用api运行例如持票人令牌,那么你需要生成一个新的令牌并且从你的UpdateUserGroup()将该令牌返回给客户端。然后,客户端需要在下一次向api发出请求时使用新的令牌。

+0

如何在未实现的帐户控制器中生成新令牌OAuthAuthorizationServerProvider – Wella

+0

@Wella您可以将OAuthAuthorizationServerOptions作为静态变量存储在Startup.Auth.cs中,然后通过身份验证选项初始化,然后从accountcontroller生成一个新的令牌。 –

+0

@Wella在此查看答案,以在控制器中生成新的令牌。 http://stackoverflow.com/questions/26969817/generate-token-in-controller –