2016-07-22 69 views
0

我使用owin登錄但無法註銷。
在開始:
使用Owin無法註銷Web Api

 
public void ConfigureOAuth(IAppBuilder app) 
     { 
    OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
      { 
       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20), 
       Provider = new AuthorizationServerProvider(), 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie    
      }; 
      app.UseOAuthBearerTokens(OAuthServerOptions); 
      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     } 

在AuthorizationServerProvider:

 
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
     { 
      context.Validated(); 
      return Task.FromResult(null); 
     } 

     public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
     { 
      context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*"}); 
      using (demoEntities _repo = new demoEntities()) 
      { 
       if (!_repo.users.Where(x => x.username == context.UserName && x.pass == context.Password).Any()) 
       { 
        context.SetError("invalid_grant", "wrong."); 
        //context.Rejected(); 
        return; 
       } 
      } 
      //context.Request. 
      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
      identity.AddClaim(new Claim("sub", context.UserName)); 
      identity.AddClaim(new Claim("role", "user")); 
      identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
      if (context.Request.Path.Value != "/api/apidemo/logout") 
      { 
       context.Request.Context.Authentication.SignIn(identity); 
      } 
      else 
      { 
       context.Request.Context.Authentication.SignOut(); 
      } 

      context.Validated(identity); 
     } 


在ApiController:

[HttpGet] 
    [ActionName("logout")] 
    public IHttpActionResult logout() 
    { 
     Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
     this.Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
     return Ok(); 
    } 

我打電話註銷,然後用舊的令牌,但它仍然可以使用。所以註銷不起作用? 感謝收看。

回答

3

這不是Owin的工作方式。沒有註銷。你得到一個令牌,該令牌在一段時間內有效。該令牌在到期前一直有效。

你可以自己添加一個額外的圖層,基本上當一個令牌生成時,將它存儲在某個地方以及它的到期數據和有效狀態。當你打電話註銷時,你將令牌更新爲無效,那麼當它被使用時,在通過owin檢查後,你運行自己的支票並使其無效。

說實話,我不會爲此而煩惱。如果你沿着這條路線走下去,這意味着你沒有使用Owin來完成它的意圖,這是應用程序級認證,而不是用戶認證。兩者之間有巨大的差異。

所以,我的建議是使用會員系統進行用戶身份驗證,並將owin的東西分開。如果你這樣做,那麼你實際上可以註銷某人。

因此,底線:owin代幣有效期到期。

+0

你能幫我解決這個問題:https://stackoverflow.com/questions/47096113/token-based-implementation-in-webapi-to-secure-endpoints –