ASP.NET Microsoft OWIN 令牌变得无效

Posted

技术标签:

【中文标题】ASP.NET Microsoft OWIN 令牌变得无效【英文标题】:ASP.NET Microsoft OWIN Token becomes invalid 【发布时间】:2021-06-18 21:23:33 【问题描述】:

我使用 OWIN 来支持 oauth2.0,它运行良好,但几个小时后令牌由于某种原因变得无效。

    验证获取令牌

    在每个请求中发送令牌(授权:Bearer token

    它首先工作得很好,然后几个小时后它变得无效并出现此错误(在 OWIN 跟踪中)

    Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware Warning: 0 : invalid bearer token received

所以基本上客户端会收到错误 401。 这是使用不同类型的客户端(移动应用程序/邮递员/提琴手)进行测试的

Startup.cs

var options = new OAuthAuthorizationServerOptions

    TokenEndpointPath = new PathString("/path/to/token"),
    Provider = new AppOAuthProvider(),
    RefreshTokenProvider = new RefreshTokenProvider(),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
    AllowInsecureHttp = true,
;

app.UseOAuthBearerTokens(options);

AppOAuthProvider.cs

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

    // Initialization.  
    string usernameVal = context.UserName;
    string passwordVal = context.Password;

    User User = authenticate();

    if (User == null )
    
        context.SetError("invalid_grant", "Invalid user/password");

        context.Response.Headers.Add(OwinChallengeFlag, new[]  ((int)HttpStatusCode.Unauthorized).ToString() ); //Little trick to get this to throw 401, refer to AuthenticationMiddleware for more
        return;
    

    /*
        Set permissions/claims
        Permissions are set here
    */

    // Setting Claim Identities for OAUTH 2 protocol.  
    ClaimsIdentity oAuthClaimIdentity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
    ClaimsIdentity cookiesClaimIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationType);
    
    // Setting user authentication.  
    AuthenticationProperties properties = CreateProperties(usernameVal, User, Permissions);
    AuthenticationTicket ticket = new AuthenticationTicket(oAuthClaimIdentity, properties);

    // Grant access to authorize user.  
    context.Validated(ticket);
    context.Request.Context.Authentication.SignIn(cookiesClaimIdentity);

请注意,服务在共享主机上运行。

【问题讨论】:

【参考方案1】:

共享主机引起的问题;每次重新启动 IIS 都会生成一个新的机器密钥,访问令牌是根据机器密钥生成的,因此令牌在 x 时间后无法进行身份验证,其中 x 是 asp.net 或 IIS 的重新启动时间(取决于托管服务提供商)。 要解决此问题,请生成机器密钥并将其放入 web.config 中,如下所示:

  <system.web>
    <httpRuntime targetFramework="4.8" />
    <machineKey validation="SHA1" decryption="AES" validationKey="yyyysecret" decryptionKey="xxxxsecrect" />
  </system.web>

如果需要,您可以使用在线工具生成机器密钥。

【讨论】:

以上是关于ASP.NET Microsoft OWIN 令牌变得无效的主要内容,如果未能解决你的问题,请参考以下文章

使用 OWIN 在 ASP.NET MVC 5 应用程序中存储和检索 facebook 访问令牌

如何在 Asp.Net Web API 2 中使用 Owin OAuth2 修改令牌端点响应正文

asp.net web api 自托管 / owin / katana

.NET Web API 2 OWIN 持有者令牌身份验证

Owin 身份令牌认证令牌端点以 404 响应

使用 Owin 时无法使 ASP.NET Web API 2 帮助页面正常工作