是否可以从 WebAPI 2 中的 authToken (RequestContext) 访问 clientId
Is it possible to access the clientId from an authToken (RequestContext) in WebAPI 2
我已经用我的 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");
但这不起作用。
登录时,您可以在 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();
您可以改用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"];
获得价值
我已经用我的 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");
但这不起作用。
登录时,您可以在 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();
您可以改用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"];