我在OWIN Cookie身份验证方面遇到了一些问题.我有一个.Net站点,其中有一些MVC页面使用cookie身份验证和受承载令牌保护的WebAPI资源.
当我退出时,我删除了客户端上的访问令牌,因此后续的API请求将不会在标头中包含令牌,因此将无法通过身份验证.这部分很好.
以同样的方式,我也希望注销以删除MVC页面使用的cookie.我在服务器上执行了以下操作:
[Route("Logout")]
public IHttpActionResult Logout()
{
var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignOut();
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
但是,在调用Logout之后,我仍然可以访问受保护的MVC页面,即使这个cookie本应被Logout调用删除了.
看起来很简单,所以我可能错过了一些东西.
谢谢,
我是OWIN的新手,这个问题一直是我的主要障碍.
基本上,在我的MVC应用程序中,我在Startup类中有以下内容:
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = OfficeSettings.ClientId,
Authority = OfficeSettings.Authority,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters()
{
RoleClaimType = "roles"
},
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthorizationCodeReceived = (context) =>
{
// code hidden for readability
if(HttpContext.Current.Session == null)
{
// It's null. Why is that?
}
var session = HttpContext.Current.Session;
if (session["myMockSession"] != null)
{
// Do stuff...
}
},
RedirectToIdentityProvider = (context) =>
{
// …Run Code Online (Sandbox Code Playgroud) 我在使用Owin托管的应用程序中创建会话时遇到问题.我尝试过使用RedisSession,但我不知道如何配置它所以它给了我一个错误.我找了一段时间的解决方案,尝试了不同的东西,最后决定在这里寻求帮助.
对象HTTPContext是空的.
我正在使用Ninject进行依赖注入.
我尝试过类似的东西:OWIN中间件可以使用http会话吗?
有没有人知道如何在Owin会话中存储登录数据?
下面是Owin配置文件,其中包含的东西都来自上面发布的链接.
[assembly: OwinStartup(typeof(Service.Startup))]
namespace Service
{
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }
);
appBuilder.RequireAspNetSession();
appBuilder.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(config);
}
public static StandardKernel CreateKernel()
{
var kernel = new StandardKernel(new Module());
return kernel;
}
}
public static class AspNetSessionExtensions
{
public static IAppBuilder RequireAspNetSession(this IAppBuilder app)
{
app.Use((context, next) =>
{
// Depending …Run Code Online (Sandbox Code Playgroud)