如何在服务器端验证我的自定义 Oauth2 访问令牌
Posted
技术标签:
【中文标题】如何在服务器端验证我的自定义 Oauth2 访问令牌【英文标题】:How can I validate my custom Oauth2 access token in server-side 【发布时间】:2014-06-15 07:40:33 【问题描述】:public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
bool isvalidUser = AuthenticateUser(context.UserName, context.Password);// validate my user&password
if (!isvalidUser)
context.Rejected();
return;
// create identity
var id = new ClaimsIdentity(context.Options.AuthenticationType);
id.AddClaim(new Claim("sub", context.UserName));
id.AddClaim(new Claim("role", "user"));
// create metadata to pass on to refresh token provider
var props = new AuthenticationProperties(new Dictionary<string, string>
"as:client_id", context.ClientId
);
var ticket = new AuthenticationTicket(id, props);
context.Validated(ticket);
登录时间我正在使用这个 SimpleAuthorizationServerProvider(在 Web Api 中)我可以获取访问令牌并将其发送到客户端。 再次登录用户需要访问其他页面,如何在服务器端(在 Web Api 中)验证我的自定义 Oauth2 访问令牌
从客户端我是这样的生成令牌
private static TokenResponse GetToken()
var client = new OAuth2Client(new Uri("http://localhost:1142/token"), "client1", "secret");
var response = client.RequestResourceOwnerPasswordAsync(uid, pwd).Result;
Console.WriteLine(response.AccessToken);
return response;
并在像这样进行身份验证后调用特定的 web api
private static void CallProfile(string token)
var client = new HttpClient();
client.SetBearerToken(token);
var response = client.GetStringAsync(new Uri("http://localhost:1142/api/Profile?id=1")).Result;
【问题讨论】:
这里只是说我的帽子,但是如果不记名令牌在授权标头中传回,那么对 User.Identity.IsAuthenticated 的简单调用应该告诉您令牌是否有效。跨度> @Mark - 但是,当通过 Ajax 请求调用该方法并且请求没有附加 User.Identity 时会发生什么? @Catchops 发出 AJAX 请求时,您必须在请求授权标头中传递您的令牌(例如,授权:Bearer YOUR_TOKEN)。 是的……知道了。我最初对如何实施授权(OWIN vs ASP.NET v2 OOTB)感到困惑。我现在将 OWIN 生成的令牌放入授权标头并通过 ClaimsIdentity 属性读取它。在荒野中徘徊了一阵子,终于亮起了灯! 【参考方案1】:实际上,OWIN 为您处理几乎所有事情。 如果您使用 ASP.NET API v2 Server 来接收请求。您只需以正确的格式在您的 http 请求中传递您的令牌。
1.发送http请求
有两种方式可以传递你的令牌:
在 http 标头中添加您的令牌。 在 URL 中添加您的令牌 (ASP.NET Web Api: How to pass an access token (oAuth 2.0) using URL parameter?)2。验证您的请求
您可以使用(ClaimsPrincipal)Thread.CurrentPrincipal.Identity.IsAuthenticated
来检查requested token
是否有效
3.授权您的请求
你可以使用[Authorize]
属性或者你可以自己写AuthorizeAttribute
如果你实现自己的 Attribute ,你可以做更多有趣的事情:连接到数据库做复杂的授权。
我认为,这是一个从 ASP.NET Web Api 中的 OAUTH2 开始的好文档:http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
【讨论】:
你好,如果我们在cookie中发送token,那么我们如何设置Authorization Header呢?我们是在AuthorizeAttribute
中这样做还是太晚了?以上是关于如何在服务器端验证我的自定义 Oauth2 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security - 来自 JWT 的自定义主体
如何使用验证“唯一”访问 Laravel 中的自定义文本框名称?
RestSharp OAuth2 承载身份验证失败,访问被拒绝