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

时间:2014-01-17 16:03:20

标签: c# asp.net asp.net-mvc asp.net-web-api signalr

我在理解几个项目的使用概念时遇到了问题。假设我有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 :(得分: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端点。另请注意,对于SignalR客户端,您应该通过Cookie或查询字符串发送身份验证tiket / token,因为headers don't play well with web sockets

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