2017-08-10 78 views
2

我已经使用WebAPI 2应用程序实现了Oauth,并且有几个应用程序访问该API。是否有可能通过WebAPI 2中的authToken(RequestContext)访问clientId

var currentUser = RequestContext.Principal; 

登录时,该clientId设置如下:

context.OwinContext.Set<AppClient>("oauth:client", client); 

有没有通过身份验证后,发出请求,而在整个身份验证令牌发送后,我可以按如下方式访问用户访问该客户端ID的方式?我想限制某些操作/控制器到某些客户端。有没有办法做到这一点?

我试图让客户如下:

var client = Request.GetOwinContext().Get<string>("oauth:client"); 

,但是这是行不通的。

回答

2

登录时,你可以在GrantResourceOwnerCredentials

identity.AddClaim(new Claim("oauth:client", client)); 

设置要求的身份这样,它可一旦用户主体的身份进行设置。

您可以创建一个扩展方法一旦你的用户主要可以从权利要求提取客户ID,以方便提取它

public static class GenericIdentityExtensions { 
    const string ClientIdentifier = "oauth:client"; 

    /// <summary> 
    /// Set the client id claim 
    /// </summary> 
    /// <param name="identity"></param> 
    /// <returns></returns> 
    public static bool SetClientId(this IIdentity identity, string clientId) { 
     if (identity != null) { 
      var claimsIdentity = identity as ClaimsIdentity; 
      if (claimsIdentity != null) { 
       claimsIdentity.AddClaim(new Claim(ClientIdentifier, clientId)); 
       return true; 
      } 
     } 
     return false; 
    }   

    /// <summary> 
    /// Return the client id claim 
    /// </summary> 
    /// <param name="identity"></param> 
    /// <returns></returns> 
    public static string GetClientId(this IIdentity identity) { 
     if (identity != null) { 
      var claimsIdentity = identity as ClaimsIdentity; 
      if (claimsIdentity != null) { 
       return claimsIdentity.FindFirstOrEmpty(ClientIdentifier); 
      } 
     } 
     return string.Empty; 
    } 
    /// <summary> 
    /// Retrieves the first claim that is matched by the specified type if it exists, String.Empty otherwise. 
    /// </summary> 
    public static string FindFirstOrEmpty(this ClaimsIdentity identity, string claimType) { 
     var claim = identity.FindFirst(claimType); 
     return claim == null ? string.Empty : claim.Value; 
    } 
} 

所以现在。

var currentUser = RequestContext.Principal; 
var client = currentUser.Identity.GetClientId(); 
相关问题