【发布时间】:2017-06-07 13:42:34
【问题描述】:
我无法从 OwinContext 环境中检索我在通过令牌进行身份验证后存储的数据。
这是代码:
[验证客户端身份验证]
在 Thins Code 中,我验证了用户的 ClientID,然后将 ApplicationClient 的数据存储在此行的 OwinContext 中
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
...
ApplicationClient App = new ApplicationClient();
App.Id = clientId;
App.ClientSecretHash = clientSecret;
// Storing Client Data
context.OwinContext.Set<ApplicationClient>("oauth:client", App);
context.Validated(clientId);
}
[GrantResourceOwnerCredentials] 在这里我验证用户凭据并将 Climes 添加到令牌中
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
...
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
if (Membership.ValidateUser(username, password))
{
identity.AddClaim(new Claim(ClaimTypes.Role, "admin"));
identity.AddClaim(new Claim(ClaimTypes.Name, username));
context.Validated(identity);
}
else
{
context.SetError("Login Field", "Error username or password");
}
}
[ControlerCode] 现在这是我的问题
[Authorize]
public class MyController : ApiController
{
public IEnumerable<SelectedMenu> GetAllMenus() // Resturants ID
{
// client is Null
ApplicationClient client = HttpContext.Current.GetOwinContext().Get<ApplicationClient>("oauth:client");
}
}
【问题讨论】:
-
GrantResourceOwnerCredentials仅在用户请求新令牌时调用。您是否尝试在不同请求之间共享您的ApplicationClient?如果没有某种持久会话,这根本不可能。我强烈建议您避免使用这种方法并使用声明将这些信息存储在令牌中。 -
另外,你能澄清一下为什么你在你的控制器中需要clientId和clientSecret吗?在 Owin OAuth 管道中验证客户端后,clientSecret 的用途是什么?
-
嗨 @FedericoDipuma 感谢重播 .. 你说得对,我只需要与我的 API 共享 client_id .. 我将删除密码。但我需要客户端 ID 在运行 API 之前在服务器端检索一些客户端信息。几秒钟前,我刚刚使用 JavaScriptSerializer 将应用程序客户端添加到声明中,然后在 API 控制器上对其进行反序列化,并且它工作正常。但是令牌现在很长:)。那么有没有更好的方法来做到这一点。
-
clientId 有多长?我认为你不需要序列化它,它通常只是一个小字符串。
-
不只是 ID,该类 ApplicationClient 中大约有 5 个属性
标签: c# asp.net-web-api2 token asp.net-apicontroller