asp.net - OWIN OAuth 2 token 是如何实际创建的?

标签 asp.net authentication asp.net-web-api oauth owin

我们可以使用OWIN OAuth 2.0(由于this fantastic post),但是需要更多了解HTTP响应中将ClaimsIdentity转换为实际access_token字符串的实际过程。

我们正在OAuth授权提供程序中使用此方法创建ClaimsIdentity:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    // <snip>
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        // validation, user checking code here

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user")); 
        context.Validated(identity);
    }
}

当我们以grant_type=password&username=user007&password=jamesbond发出HTTP POST请求时(这里的密码松散,可以),我们得到HTTP POST响应主体
{"access_token":"9K8VtOBseU0-XZfdGe2_urn2HESY3jLkpgvowOQFPXsHeWNOrTlTVzfPu35ZEvr4AqSj_b0laesBegtVWuR8R-aItnNXw4vXiuCg0cTNMUKP_yfi89VhD446o2X6ffL8upwZVILpomweSweIVlDmwUDzIwf1ZqubrQ8vuiQDFu-_7vpjPwJ5yVvomQ75agsJWMZk-H_bVWSObds82aM8LCRJwb2bUJchr6_L1GP8xdXqRQz24uDhHvco-XByyMSMzZm-Qo0VVBbocbgP64OJulbihVG_W9e8G69UfbX99pIYiLyE4jixiUtjOKSiMYBISW3_fg","token_type":"bearer","expires_in":1799,"as:client_id":"","userName":"user007",".issued":"Fri, 31 Oct 2014 16:02:05 GMT",".expires":"Fri, 31 Oct 2014 16:32:05 GMT"}
问题:创建实际access_token字符串的逻辑是什么?

问题中的一些具体问题
  • access_token字符串的内部结构是什么?
  • 是加密的还是签名的?使用的 key 是什么(假设IIS/Azure Cloud Service)?
  • 我们如何覆盖生成实际发出的字符串的实现,然后在后续访问中检查相同的 token /字符串?

  • 谢谢

    最佳答案

    很高兴我的帖子很有用,请找到以下答案:

    1-此“魔术”字符串是加密的签名字符串(poor MSDN documentation,指的是加密或签名,没有明确的含义),其中包含已登录用户的所有声明和票证属性的反序列化版本。如果在IIS模式下,则通过 machineKey 节点(documentation)中的“decryptionKey”和“validationKey”键值进行加密/签名。如果作为独立的OWIN应用程序运行,则加密将使用旧版DPAPI对其进行保护,并且实际上使用过时的3DES算法(documentation)。它的默认实现在source code here中。

    2-在第1点中回答。

    3-检查我的new post,其中显示了如何发布签名的Json Web token 而不是默认访问 token 。

    希望这能回答您的问题。

    关于asp.net - OWIN OAuth 2 token 是如何实际创建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26679111/

    相关文章:

    html - 登录表单输入未激活

    spring - 如何在 Spring 身份验证成功处理程序方法中访问原始 HttpServletRequest 对象?

    wcf - 需要一个 "SOAP Client with WSSE authentication"... Visual Studio 是否满足这个需求?

    c# - Web Api 和 WCF 的相同实体

    c# - 从具有嵌套母版页的内容页访问控件

    c# - 使用 RequiredFieldValidator 验证服务器控件中的文本框

    asp.net - ASP.NET 2.0或3.5?

    asp.net - 如何使用 ASP.NET 创建动态子域?

    azure - Web api 中的 Crystal 报表在 azure 服务器中无法工作

    c# - Web API 将输入转换为随机 int