2017-08-10 5 views
2

私はWebAPI 2アプリケーションでOauthを実装しており、いくつかのアプリケーションがAPIにアクセスしています。 WebAPI 2のauthToken(RequestContext)からclientIdにアクセスすることは可能ですか?

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

があります:ログインするとき

var currentUser = RequestContext.Principal; 

次のように、clientIdが設定されました:認証されると、以下のように、認証トークン間で送信しながら要求を行った後、私は、ユーザーにアクセスすることができますそのクライアントIDにアクセスする方法は?特定のアクション/コントローラを特定のクライアントに制限したい。これを行う方法はありますか?

私は次のようにクライアントを取得しようとしている:

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

が、これは動作しません。あなたの中にログインしたユーザプリンシパルのアイデンティティが設定された後、それが利用可能であることを道GrantResourceOwnerCredentials

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

で身元の主張を設定することができ

答えて

2

あなたはユーザープリンシパルを持っていたら、だから今は、請求項からクライアント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(); 
関連する問題