Cookies 如何使用OWIN在Web API中结合OAuth和cookie身份验证?

Cookies 如何使用OWIN在Web API中结合OAuth和cookie身份验证?,cookies,asp.net-web-api,oauth,asp.net-web-api2,Cookies,Asp.net Web Api,Oauth,Asp.net Web Api2,我有一个ASP.NET Web API项目,它是使用OWIN的OAuth 2授权提供程序。一旦OAuth访问令牌过期,我们希望退回到cookie身份验证,以静默方式续订令牌,而无需用户登录。有没有办法做到这一点 我们使用来自角度页面的隐式授权流来访问API。我们希望代币定期到期,因为我们觉得这样更安全。我们希望使用登录页面发布的cookie来允许我们在没有交互登录的情况下发布令牌 我们在Startup.cs中有以下内容: public void Configuration(IAppBuilder

我有一个ASP.NET Web API项目,它是使用OWIN的OAuth 2授权提供程序。一旦OAuth访问令牌过期,我们希望退回到cookie身份验证,以静默方式续订令牌,而无需用户登录。有没有办法做到这一点

我们使用来自角度页面的隐式授权流来访问API。我们希望代币定期到期,因为我们觉得这样更安全。我们希望使用登录页面发布的cookie来允许我们在没有交互登录的情况下发布令牌

我们在Startup.cs中有以下内容:

public void Configuration(IAppBuilder app)
{
    var webConfiguration = WebConfiguration.Initialize(WebConfigurationManager.AppSettings);
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        AuthenticationMode = AuthenticationMode.Passive,
        LoginPath = new PathString("/logon"),
        ExpireTimeSpan = webConfiguration.Authentication.CookieExpirationTimeSpan
    });

    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    app.UseOAuthAuthorizationServer(
        new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            AuthorizeEndpointPath = new PathString("/oauth/authorize"),
            AccessTokenExpireTimeSpan = webConfiguration.OAuth.AccessTokenExpirationTimeSpan,
            Provider = new LegacyAuthorizationServerProvider(
                new OAuthClientValidator(new WebConfigurationOAuthClientSource(webConfiguration)),
                new LegacyAuthenticator(new AuthenticationResultHandlerFactory(), new RefreshTokenResultHandler())),
        });
    var httpConfiguration = new HttpConfiguration();

    httpConfiguration.SuppressDefaultHostAuthentication();

    httpConfiguration.Filters.Add(new HostAuthenticationAttribute(OAuthDefaults.AuthenticationType));

}
然后在我们的LegacyAuthorizationServerProvider中,我们有:

public class LegacyAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    ...
    private async Task Authorize(OAuthAuthorizeEndpointContext context)
    {
        if (context == null) { throw ArgumentIs.Null(nameof(context)); }

        var authenticateResult = await context.OwinContext.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ApplicationCookie);
        if (authenticateResult?.Identity == null)
        {
            context.OwinContext.Authentication.Challenge(DefaultAuthenticationTypes.ApplicationCookie);
        }
        else
        {
            var claimsIdentity = new ClaimsIdentity(
                authenticateResult.Identity.Claims,
                "Bearer",
                "sub",
                "role");

            context.OwinContext.Authentication.SignIn(claimsIdentity);
        }

        context.RequestCompleted();
    }
我们将AccessTokenExpirationTimeSpan设置为15分钟,CookieExpirationTimeSpan设置为10小时,目的是在cookie过期之前不登录就发布令牌。问题是authenticateSync()在OAuth访问令牌过期后返回null。只有在令牌过期之前调用authorize,它才会成功

仅供参考,以下是登录页面控制器中登录的代码:

    [HttpPost]
    [ActionName("logon")]
    public ActionResult LogOnPost(LogOnFormModel form)
    {
        if (form == null) 
        { 
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, Resources.AuthenticationController_LogOnPost_NullFormResultMessage); 
        }

        var context = new LegacyAuthenticationContext(form.UserName, form.Password);

        _legacyAuthenticator.Authenticate(context);

        if (context.Authenticated)
        {
            var claimsIdentity = new ClaimsIdentity(
                context.CreateClaims(),
                "sub",
                "role");

            HttpContext.GetOwinContext().Authentication.SignIn(claimsIdentity);
        }
        return LogOn();
    }

是否有一种方法可以使用cookie进行身份验证,而不是让用户登录(当我们发出另一个OAuth令牌时)?一旦cookie过期,我们将需要另一个登录。

我们发现cookie过期在某个点被覆盖。我们仍然不知道为什么。但是,我们现在正在围绕以下方面开展工作:

    private class CookieProvider : CookieAuthenticationProvider
    {
        public CookieProvider()
        {
            OnResponseSignIn = SignIn;
        }

        private void SignIn(CookieResponseSignInContext obj)
        {
            if (obj.Properties.IssuedUtc.HasValue)
            {
                obj.Properties.ExpiresUtc = obj.Properties.IssuedUtc.Value.Add(obj.Options.ExpireTimeSpan);
            }
        }
    }

我们将此提供程序添加到Startup.Auth.cs中,作为CookieAuthenticationOptions的一部分。提供程序

我对此解决方案仍有问题,因为过期时间是访问令牌过期14分钟,而不是cookie过期24小时。