存储 owin oauth 不记名令牌
Store owin oauth bearer token
我正在使用默认的 owin oauth 服务器创建一个简单的身份验证服务器。提供正确的凭据后,将生成不记名令牌并将其返回给客户端。我在其他人中使用了 Taiseer
的 tutorial
我想在将令牌发送到客户端之前将令牌存储在数据库中。
也许我完全忽略了它,但是在发送之前我在哪里可以获得令牌?据我所知,令牌是在 GrantResourceOwnerCredentials 方法中验证票证后生成的。
我猜令牌存储在上下文中。我怎样才能把它弄出来?
Startup.cs
private void ConfigureAuthServer(IAppBuilder app) {
// Configure the application for OAuth based flow
var oAuthServerOptions = new OAuthAuthorizationServerOptions {
//For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14)
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
ApplicationOAuthProvider
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) {
//Dummy check here
if (context.UserName != context.Password) {
context.SetError("invalid_grant", "The user name or password is incorrect");
return Task.FromResult<object>(null);
}
var claims = new List<Claim> {
new Claim(ClaimTypes.NameIdentifier, context.UserName),
new Claim(ClaimTypes.Name, context.UserName)
};
var oAuthIdentity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
context.Validated(ticket);
return Task.FromResult<object>(null);
}
public override Task TokenEndpoint(OAuthTokenEndpointContext context) {
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) {
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
注意:对于那些想知道我为什么要存储令牌的人。这是我必须满足的要求。
要在将令牌发送到客户端之前获取令牌,您必须覆盖 TokenEndpointResponse
:
public override Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context)
{
return base.TokenEndpointResponse(context);
}
context
对象有一个 属性 AccessToken
,它将包含令牌的字符串表示形式。
OAuthTokenEndpointResponseContext
包含一个对象字典
IDictionary<string, object>
in AdditionalResponseParameters
这使我们能够找到该身份的所有声明。
如果我们想获取令牌的到期时间,我们会在字典中找到声明 .expires
:
context.AdditionalResponseParameters[".expires"]
如果有人有兴趣玩客户端和服务器交互的简单集成,这里有 github repository。
我正在使用默认的 owin oauth 服务器创建一个简单的身份验证服务器。提供正确的凭据后,将生成不记名令牌并将其返回给客户端。我在其他人中使用了 Taiseer
的 tutorial我想在将令牌发送到客户端之前将令牌存储在数据库中。 也许我完全忽略了它,但是在发送之前我在哪里可以获得令牌?据我所知,令牌是在 GrantResourceOwnerCredentials 方法中验证票证后生成的。 我猜令牌存储在上下文中。我怎样才能把它弄出来?
Startup.cs
private void ConfigureAuthServer(IAppBuilder app) {
// Configure the application for OAuth based flow
var oAuthServerOptions = new OAuthAuthorizationServerOptions {
//For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14)
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
ApplicationOAuthProvider
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) {
//Dummy check here
if (context.UserName != context.Password) {
context.SetError("invalid_grant", "The user name or password is incorrect");
return Task.FromResult<object>(null);
}
var claims = new List<Claim> {
new Claim(ClaimTypes.NameIdentifier, context.UserName),
new Claim(ClaimTypes.Name, context.UserName)
};
var oAuthIdentity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
context.Validated(ticket);
return Task.FromResult<object>(null);
}
public override Task TokenEndpoint(OAuthTokenEndpointContext context) {
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) {
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
注意:对于那些想知道我为什么要存储令牌的人。这是我必须满足的要求。
要在将令牌发送到客户端之前获取令牌,您必须覆盖 TokenEndpointResponse
:
public override Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context)
{
return base.TokenEndpointResponse(context);
}
context
对象有一个 属性 AccessToken
,它将包含令牌的字符串表示形式。
OAuthTokenEndpointResponseContext
包含一个对象字典
IDictionary<string, object>
in AdditionalResponseParameters
这使我们能够找到该身份的所有声明。
如果我们想获取令牌的到期时间,我们会在字典中找到声明 .expires
:
context.AdditionalResponseParameters[".expires"]
如果有人有兴趣玩客户端和服务器交互的简单集成,这里有 github repository。