我有一个正在调用 WebAPI 的 MVC 5 应用程序。 WebAPI 使用不记名 token 进行身份验证。 WebAPI 中有一种方法(操作),我想使用 Google 返回的 token 进行身份验证。为此,我对 WebAPI 方法执行以下操作
[OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[Route("{userName}")]
public async Task<User> GetUser(string userName)
尽管如此,我仍然从 WebAPI 收到 UNAUTHORIZED 错误。我需要做什么来解决这个问题?除了这个当我使用 [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] API 如何验证 token ?
最佳答案
如果您已提供发送到此端点的请求,则答复会更容易。我想你没有发送 Authorization: Bearer header,但是你发送了 Cookie:.AspNet.ExternalCookie=,所以 OWIN 没有授权你之前获得的这个 cookie(因为你声明你想要验证你的操作方法使用身份验证 header 及其 Bearer token )。
尝试将 HostAuthentication
更改为:HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
并确保您已添加 app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
在您的 OWIN Startup
中。
那么 ASP.NET(如果更精确的话是 OWIN)如何处理授权?
简而言之:当您的应用程序启动时,通常在 Startup 中声明您的应用程序使用的内容(cookie、不记名 token 等)。因此,当您调用 app.UseOAuthBearerTokens(OAuthOptions);
时,OWIN 会在管道中注册处理程序。然后,关于您拥有哪些操作过滤器,OWIN 会调用这些处理程序,它们会检查请求上下文中是否存在 header 或 cookie 或其他任何内容(这一切都取决于处理程序)。比方说,如果 CookieAuthenticationHanlder 找到 cookie,它会对其进行解密,检查一些规则(取决于处理程序,CookieAuthenticationHandler 检查到期日期)并传递给 CookieAuthenticationProvider 以进行额外验证。然后你的请求是否被授权取决于请求包含什么以及它是否通过那些被触发的处理程序取决于你有什么过滤器。
我还建议通过 ASP.NET Identity resources , 检查一些 ASP.NET Identity source code (我建议在 VS 中使用 R# 来检查库代码)以及 setup your Visual Studio并深入研究 ASP.NET Identity 和 OWIN 调试,以了解身份验证管道的工作原理。
关于.net - Google 身份验证 [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 返回 UNAUTHORIZED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259779/