【问题标题】:Is it possible to access the clientId from an authToken (RequestContext) in WebAPI 2是否可以从 WebAPI 2 中的 authToken (RequestContext) 访问 clientId
【发布时间】:2018-01-18 15:35:13
【问题描述】:

我已经使用我的 WebAPI 2 应用程序实现了 Oauth,并且有多个应用程序访问该 API。一旦通过身份验证,在通过身份验证令牌发送请求后,我可以按如下方式访问用户:

var currentUser = RequestContext.Principal;

登录时clientId设置如下:

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

有没有办法访问该客户 ID?我想将某些操作/控制器限制为某些客户端。有没有办法做到这一点?

我尝试如下获取客户端:

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

但这不起作用。

【问题讨论】:

    标签: c# oauth-2.0 authorization asp.net-web-api2 owin


    【解决方案1】:

    您可以改用AuthenticationProperties。与回答相同,在GrantResourceOwnerCredentials 中只需在出票时执行下一个内容:

    var props = new AuthenticationProperties(new Dictionary<string, string>
    {
        {
            "client_id", clientId
        },
    });
    
    var ticket = new AuthenticationTicket(identity, props);
    context.Validated(ticket);    
    

    然后,您就可以通过context.Ticket.Properties.Dictionary["client_id"];获得价值

    【讨论】:

      【解决方案2】:

      登录时,您可以在GrantResourceOwnerCredentials 中设置身份声明

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

      这样,一旦设置了用户主体的身份,它就可用。

      你可以创建一个扩展方法来方便地提取它

      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;
          }
      }
      

      现在,一旦您拥有用户主体,您就可以从声明中提取客户端 ID。

      var currentUser = RequestContext.Principal;
      var client = currentUser.Identity.GetClientId();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2014-05-11
        相关资源
        最近更新 更多