2016-07-22 32 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で :ApiControllerで

 
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); 
     } 


[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 –

関連する問題