首页 文章

在不同的项目中理解和使用IPrincipal

提问于
浏览
1

我在理解几个项目的使用概念时遇到了问题 . 假设我有4个项目

  • Business.Services

  • Presentation.MVC

  • Presentation.WebApi

Business.Services是发生所有业务逻辑和数据库连接的项目 . MVC,Web Api项目引用服务来调用业务逻辑 . MVC和web api之间没有任何交互,因为在我的情况下它们完全用于不同的目的 . Web Api仅代表处理移动客户端请求/响应 .

在我的MVC项目中,我向用户提供登录,并在成功登录后创建 FormsAuthenticationTicket 并在此票证的帮助下,如果用户可用于指定操作,则执行自定义授权 . 除此之外,我根据授权中的 FormsAuthenticationTicket 数据创建了IPrincipal . 设置完之后,我可以像 HttpContext.Current.User 一样到达它 .

另一方面,在我的Web Api项目中,所有请求都需要基本身份验证 . 有一个登录操作,用户需要发送LoginName和Password才能获得将用于将来请求的令牌 . 一旦客户端检索到令牌,客户端会在查询字符串末尾添加?token参数 . 当请求到达Web Api时,它会输入我的 CustomAuthorizationAttribute 并再次检查用户是否有资格获得该请求 . 此外,我将 Thread.CurrentPrincipalHttpContext.Current.User 设置为 IPrincipal 对象,该对象由令牌确定 .

到目前为止这些都很好 . 这个问题从这里开始 . 我想将SignalR放入我的Presentation.WebApi项目中 . 据我所知,OWIN在所有MVC,WebApi之上,因此,如果我们已经有一个,我们就不需要拥有身份验证系统 . 所以第一个问题是:如何通过此信号器创建授权?我得到Context.User(IPrincipal)自然为null . 这似乎没问题,因为在我的web api中,IPrincipal对象是由 CustomAuthorizationAttrbute 中的每个请求设置的 . 此外,我如何授权来自 Presentation.MVC 的用户?我应该为mvc用户提供一个为他提供令牌的新方法吗?我可以使用它的FormsAuthenticationTicket数据来进行授权吗?

1 回答

  • 0

    据我所知,您的所有应用程序都托管在同一主机下(IIS,我假设) . 如果是这样,请从应用程序中移动任何身份验证代码,并在OWIN中间件级别启用它 . Cookie based authentication is already provided by the ASP.NET团队作为NuGet包:Microsoft.Owin.Security.Cookies .

    一旦有了这个身份验证层,就可以在每个应用程序中使用提供的 AuthorizeAttribute 进行不同级别的授权(在这里使用命名空间很好,因为每个Web框架都有自己的 AuthorizeAttribute ) . 这应该适用于ASP.NET MVC和SignalR endpoints . 另请注意,对于SignalR客户端,您应该通过Cookie或查询字符串发送身份验证tiket / token,因为headers don't play well with web sockets .

    您还希望为ASP.NET Web API应用程序提供基于令牌的身份验证 . 不知道是什么类型的'token'但你提到了基本身份验证(这不是基于令牌的身份验证,但我想你已经知道了) . 在这种情况下,您可以为ASP.NET Web API应用程序提供特定的基本身份验证中间件 . Katana项目实际上有一个BasicAuthenticationMiddleware实现,但它从未发布过 . 如果您想编写自己的身份验证中间件,可以查看Pablo M. Cibraro(又名Cibrax)的“Writing an AuthenticationHandler for Katana” .

相关问题