asp.net-mvc - OWIN认证中间件 : logging off

标签 asp.net-mvc authentication owin owin-middleware

这里是 OWIN 初学者。请耐心等待...

我正在尝试构建一个 OWIN 身份验证中间件,它使用表单帖子与我的外部身份验证提供商进行通信。我在使身份验证位正常工作方面取得了一些成功。换句话说,我可以:

  1. 通过表单发布与远程提供商沟通;
  2. 处理删除提供程序返回的响应
  3. 如果一切正常,我就可以向默认身份验证提供商发出信号
  4. 这又被 cookie 中间件接收,最终生成身份验证 cookie

到目前为止,一切都很好。现在,我想知道如何处理注销请求。目前, Controller 将简单地从 owin 上下文中获取默认的身份验证管理器并调用其 SingOut 方法。这实际上结束了我当前的 session (通过删除 cookie),但它实际上对现有的“外部” session 没有任何作用。

所以,这是我的问题: 1. 身份验证中间件是否也负责执行注销请求? 2.如果是这种情况,那么有人可以向我指出一些如何完成的文档/示例吗?我在网上找到了一些链接,其中部分描述了日志记录,但没有找到有关注销过程的任何信息...

谢谢。

路易斯

最佳答案

经过一番挖掘,我已经成功让一切正常工作。我会写一些提示,可能会帮助将来遇到类似问题的人...

关于第一个问题,答案是肯定的,您可以将注销委托(delegate)给中间件。如果您决定这样做,那么您的中间件处理程序应重写 ApplyResponseGrantAsync 方法并检查当前是否存在撤消请求。下面是一些有助于说明原理的代码:

protected override async Task ApplyResponseGrantAsync() {
    var revoke = Helper.LookupSignOut(Options.AuthenticationType, 
                                               Options.AuthenticationMode);
    var shouldEndExternalSession = revoke != null;
    if (!shouldEndExternalSession) {
       return;
    }
    //more code here...
 }

检查是否存在撤销请求,并且您的外部身份验证提供程序能够通过重定向结束响应后,您可以简单地调用 Response.Redirect 方法(不要忘记检查重定向是否存在 -例如:如果您使用的是 ASP.NET 身份和 MVC 自动生成的代码,那么注销会将您重定向到站点的主页)。

在我的场景中,事情有点复杂,因为与我的身份验证提供商的通信是基于表单帖子 ( SAML2 messages with HTTP Post binding )。我首先尝试使用 Response.Write 将带有自动回发表单的 HTML 注入(inject)到输出缓冲区中:

protected override async Task ApplyResponseGrantAsync() {
    //previous code + setup removed
    var htmlForm = BuildAndSubmitFormWithLogoutData(url, 
                        Options.UrlInicioSessaoAutenticacaoGov);
    Response.StatusCode = 200;
    Response.ContentType = "text/html";
    await Response.WriteAsync(htmlForm);
}

不幸的是,它根本没有成功。不知道为什么,但浏览器坚持将页面重定向到 Logoff Controller 方法定义的 URL(将页面重定向到其主页或“/”)。我什至尝试从 ApplyResponseGrantAsync 方法中删除位置 HTTP header ,但它最终仍然将用户重定向到主页(而不是加载我正在编写的预定义 HTML)。

我最终更改了重定向,以便它由我的中间件处理。这是我在 ApplyResponseGrant 方法中最终得到的代码:

protected override async Task ApplyResponseGrantAsync() {
    //previous code + setup removed
    //setup urls for callbabk and correlation ids
    var url = ...; //internal cb url that gets handled by this middleware
    Response.Redirect(url);
}

此重定向迫使我更改 InvokeAsync 实现,以便它现在负责:

  1. 检查新的身份验证 session
  2. 检查现有身份验证 session 是否结束(处理来自外部提供商的注销响应)
  3. 检查是否应生成新的表单发布 html 消息来结束由外部提供商控制的当前 session

这里有一些伪代码试图说明这一点:

public override async Task<bool> InvokeAsync() {
    if (Options.InternalUrlForNewSession.HasValue && 
               Options.InternalUrlForNewSession == Request.Path) {
           return await HandleLoginReply(); /login response
    }
    if (Options.InternalUrlExternalSessionEnded.HasValue && 
               Options.InternalUrlExternalSessionEnded == Request.Path) {
           return await HandleLogoffReply();//logoff response
    }
    if (Options.InternalUrlForEndingSession.HasValue &&   
                Options.InternalUrlForEndingSession == Request.Path) {
            return await HandleStartLogoutRequest(); //start logoff request 
    }
    return false;
}

是的,最后,我提出了一个额外的请求,在我看来,这是不需要的。再说一次,我可能错过了一些东西。如果有人设法让 ApplyResponseGrantAsync 返回自动提交帖子(而不是重定向),请告诉我如何操作。

谢谢。

关于asp.net-mvc - OWIN认证中间件 : logging off,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46380458/

相关文章:

ios - 是否可以使用OAuth & Twitter Reverse-Auth 传递OAuth Token 和Token Secret?

asp.net - OWIN token 身份验证 400 来自浏览器的 OPTIONS 的错误请求

css - MVC WebGrid - 设置列宽

asp.net-mvc - HTML 表单回发后隐藏字段不会更新

asp.net-mvc - asp.net mvc - 在 View 中显示富文本代码

c# - Web API 自定义身份验证过滤器

c# - HttpContext.GetOwinContext().GetUserManager<AppRoleManager>() 返回 null

android - MVC网站调用WCF比较好或者MVC直接调用数据库操作比较好

javascript - React Native WebView 中的身份验证

ruby-on-rails - Rails 测试 - 如何模拟登录