【发布时间】:2015-09-10 04:12:23
【问题描述】:
我正在使用 Angular 和 webapi 开发跨平台 Web 应用程序。问题是当角度应用程序在科尔多瓦容器中运行时。为了与设备上的其他应用程序配合使用,我需要使用 SSO 插件。这个插件是导致我出现问题的原因,因为它做了一些事情。它拦截所有http请求并向标头添加一个不记名令牌,该不记名令牌由第3方令牌提供程序生成,因此我无法对其进行解码,并覆盖我在标头中设置的任何不记名令牌。它似乎也阻止了饼干..
因此,当您无法向您发送自己的本地凭据时,它会变得有点棘手。
所以我从https://coding.abel.nu/2014/06/writing-an-owin-authentication-middleware/和http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.OAuth/OAuthBearerAuthenticationHandler.cs开始
所以我想我应该编写自己的中间件来处理这个问题;我认为既然标准的 oauth 中间件可以在没有 cookie 的情况下工作,我应该不会花太多时间让我稍微不同的不记名令牌中间件来做到这一点。但事实并非如此......编写我自己的中间件......所以我'能够获取标头,通过外部令牌提供程序进行验证,但我实际上无法登录。
protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()
{
try
{
// Find token in default location
string requestToken = null;
string authorization = Request.Headers.Get("Authorization");
if (!string.IsNullOrEmpty(authorization))
{
if (authorization.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
{
requestToken = authorization.Substring("Bearer ".Length).Trim();
}
}
.... Take the Request token call other Server, verify token...
还有
public override async Task<bool> InvokeAsync()
{
var ticket = await this.AuthenticateAsync();
if(ticket != null)
{
this.Context.Authentication.SignIn(new AuthenticationProperties(), grantIdentity);
return false;
}
}
所以最终登录不会导致错误或任何事情,但实际上并没有登录。一旦我得到一个带有 [Authorize] 属性的控制器操作,我就会得到一个 401。我没有启用任何外部 cookie。我很有可能走错了路,或者我做得太难了。
【问题讨论】:
-
我发现只覆盖授权属性更简单。我问了一个类似的问题,这个人给了我以下链接(BitOfTech.net)。如果你明白了,请发帖 (stackoverflow.com/questions/32099027/…)
-
@Mr.B - 嘿,看看我的答案。我终于能做到了。
标签: c# oauth asp.net-web-api owin bearer-token