C# 是否可以从WebAPI 2中的authToken(RequestContext)访问clientId

C# 是否可以从WebAPI 2中的authToken(RequestContext)访问clientId,c#,oauth-2.0,authorization,asp.net-web-api2,owin,C#,Oauth 2.0,Authorization,Asp.net Web Api2,Owin,我已经用我的WebAPI 2应用程序实现了Oauth,有几个应用程序可以访问该API。一旦通过身份验证,在通过身份验证令牌发送请求后,我可以按如下方式访问用户: var currentUser = RequestContext.Principal; context.OwinContext.Set<AppClient>("oauth:client", client); var client = Request.GetOwinContext().Get<string>("

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

var currentUser = RequestContext.Principal;
context.OwinContext.Set<AppClient>("oauth:client", client);
var client = Request.GetOwinContext().Get<string>("oauth:client");
登录时,
clientId
设置如下:

var currentUser = RequestContext.Principal;
context.OwinContext.Set<AppClient>("oauth:client", client);
var client = Request.GetOwinContext().Get<string>("oauth:client");
context.OwinContext.Set(“oauth:client”,client);
有没有办法访问该客户端Id?我想将某些操作/控制器限制到某些客户端。有办法做到这一点吗

我已尝试按如下方式获取客户:

var currentUser = RequestContext.Principal;
context.OwinContext.Set<AppClient>("oauth:client", client);
var client = Request.GetOwinContext().Get<string>("oauth:client");
var client=Request.GetOwinContext().Get(“oauth:client”);

但这是行不通的

登录时,您可以在
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;
    }
}

您可以改用
AuthenticationProperties
。与回答相同,在
GrantResourceOwnerCredentials
中,在票据发行时只需执行下一步操作:

var props = new AuthenticationProperties(new Dictionary<string, string>
{
    {
        "client_id", clientId
    },
});

var ticket = new AuthenticationTicket(identity, props);
context.Validated(ticket);    
var props=新的AuthenticationProperties(新字典)
{
{
“客户id”,客户id
},
});
var票证=新的身份验证票证(身份、道具);
上下文。已验证(票证);
然后,您将能够通过
context.Ticket.Properties.Dictionary[“client_id”]获取值