支持基本和表单的webapi,mvc和signalr的单一认证管道

 my76572 发布于 2023-01-06 11:43

我目前的服务是使用MVC来渲染表单,WebApi来回移动我的viewModels,使用signalR来推送通知等.

如果用户正在浏览网站,他们将使用表单身份验证,但我们正在推出一些移动应用程序,我希望能够使用基本身份验证从移动应用程序中使用webapi和signalr,而无需维护两个单独的集合控制器.

我有两个IPrincipal,一个SessionPrincipal和一个BasicPrincipal(其中Session Principal继承了BasicPrincipal并有一些额外的上下文数据).这个想法是一些控制器需要在网站上(SessionPrincipal),但网络和移动用户(Basic Principal)都可以访问其他所有控制器.有些人根本不需要任何授权,因此不能拒绝请求.

我目前的方法做了以下步骤来实现这一点(为简洁起见,省略了一些代码)

Global.asax Application_AuthenticateRequest

var cultureCookie = Request.Cookies["Culture"];
// Set culture ...

var authHeader = Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic"))
{
    //Check Username / Password. If okay...
     HttpContext.Current.User = new BasicAuthPrincipal(user);
}
else
{
    var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
        // Try and resolve Session from encrypted forms auth data.  If okay...
        HttpContext.Current.User = new SessionAuthPrincipal(Id, User, Agent);
    }
}

个人授权过滤器(SessionMVC,SessionApi,BasicApi)基本归结为:

return HttpContext.Current.User as SessionPrincipal != null;

// Or

return HttpContext.Current.User as BasicPrincipal != null; 

因此,如果它们已成功设置在global.asax中,则继续执行控制器.

现在,我有一个有效的实施,为什么我要求帮助?

我不确定某些可能会扰乱这种情况的边缘场景.我这样做是否有问题?

我读到HttpContext不是线程安全的,但是Application_AuthenticateRequest应该在其他所有内容之前运行,并且不会对该数据进行进一步的更改,所以我认为它应该没问题.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有