【问题标题】:Understanding and Using IPrincipal in different Projects在不同项目中理解和使用 IPrincipal
【发布时间】:2014-01-18 04:31:16
【问题描述】:

我在理解多个项目中使用它的概念时遇到了问题。假设我有 4 个项目

  • 业务.服务
  • Presentation.MVC
  • Presentation.WebApi

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

在我的 MVC 项目中,我为我的用户提供了一个登录名,在成功登录后,我创建了FormsAuthenticationTicket,如果用户可用于指定的操作,我将在此票证的帮助下执行自定义授权。除此之外,我还根据 Authorization 中的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) 自然为空。看起来没问题,因为在我的 web api IPrincipal 对象是由 CustomAuthorizationAttrbute 中的每个请求设置的。此外,我如何授权来自Presentation.MVC 的用户?我应该为向他提供令牌的 mvc 用户提供一种新方法吗?我可以使用它的 FormsAuthenticationTicket 数据来授权吗?

【问题讨论】:

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


    【解决方案1】:

    据我从问题中了解到,您的所有应用程序都托管在同一主机下(我假设是 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 或查询字符串发送身份验证票证/令牌,因为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”。

    【讨论】:

    • 在这种情况下,我必须删除基本身份验证才能访问 SignalR 对吗?因为 WebAPI 需要托管在 IIS web api 上的基本身份验证和信号器。问题是我不在 WebAPI 上使用基于 cookie 的身份验证,我创建了由 Login 操作生成的自定义令牌,并使用它来授权 Web api 中的其他方法。问题是我永远无法在任何级别进行令牌检查:S
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多