如何在服务器端验证我的自定义 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 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

Oauth2:资源服务器应该如何知道访问令牌是不是有效?

Spring Security - 来自 JWT 的自定义主体

如何使用验证“唯一”访问 Laravel 中的自定义文本框名称?

RestSharp OAuth2 承载身份验证失败,访问被拒绝

Google Cloud Endpoints 的自定义身份验证(而不是 OAuth2)

如何让 OAuth 2.0 正确地在我的自定义 API .net 核心中使用外部 API