无法使用 Owin 注销 Web Api
Can't sign out Web Api using Owin
我已经使用 owin 登录,但无法退出。
在开始:
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();
}
我调用注销然后使用旧令牌,但它仍然可以使用。所以注销不起作用?
感谢收看
这不是 Owin 的工作方式。没有注销。您将获得一个令牌,该令牌在一定时间内有效。令牌在到期前一直有效。
您可以自己添加一个额外的层,基本上是在生成令牌时,将其与到期数据和有效状态一起存储在某个地方。当您调用注销时,您将令牌更新为无效,然后当它被使用时,在它通过 owin 检查后,您然后 运行 您自己的检查并使它无效。
老实说,我不会为此烦恼。如果您沿着这条路线走下去,则意味着您没有使用 Owin 来实现它的目的,即应用程序级身份验证,而不是用户身份验证。两者差别很大。
所以,我的建议是使用会员系统进行用户身份验证,并将 owin 的东西分开。如果你这样做,那么你实际上可以将某人注销。
所以底线:owin 令牌在过期前一直有效。
我已经使用 owin 登录,但无法退出。
在开始:
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();
}
我调用注销然后使用旧令牌,但它仍然可以使用。所以注销不起作用? 感谢收看
这不是 Owin 的工作方式。没有注销。您将获得一个令牌,该令牌在一定时间内有效。令牌在到期前一直有效。
您可以自己添加一个额外的层,基本上是在生成令牌时,将其与到期数据和有效状态一起存储在某个地方。当您调用注销时,您将令牌更新为无效,然后当它被使用时,在它通过 owin 检查后,您然后 运行 您自己的检查并使它无效。
老实说,我不会为此烦恼。如果您沿着这条路线走下去,则意味着您没有使用 Owin 来实现它的目的,即应用程序级身份验证,而不是用户身份验证。两者差别很大。
所以,我的建议是使用会员系统进行用户身份验证,并将 owin 的东西分开。如果你这样做,那么你实际上可以将某人注销。
所以底线:owin 令牌在过期前一直有效。