我使用webapi项目作为我的auth服务器和资源服务器。目的是访问服务形式的Android应用程序。我还想要一个用MVC应用程序编写的Web前端。我最初使用的是默认的MVC auth,但已经转移到web pai发放令牌。我可以从webapi服务接收auth令牌,我将令牌发送到cookie中的客户端,尽管我可能只是缓存客户端。我目前正在运行以下OAuthBearerAuthenticationProvider:
public class CookieOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
public override Task RequestToken(OAuthRequestTokenContext context)
{
base.RequestToken(context);
var value = context.Request.Cookies["AuthToken"];
if (!string.IsNullOrEmpty(value))
{
context.Token = value;
}
return Task.FromResult<object>(null);
}
}
在我的启动课中我有这个方法:
private void ConfigureAuth(IAppBuilder app)
{
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new CookieOAuthBearerProvider(),
});
}
我在Configuration方法中调用。
我似乎缺少的是如何将我的令牌转换为登录用户。我似乎无法弄清楚deserializtion发生在哪里。我尝试将configueAuth更改为:
private void ConfigureAuth(IAppBuilder app)
{
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new CookieOAuthBearerProvider(),
AccessTokenProvider = new AuthenticationTokenProvider()
{
OnReceive = receive
}
});
}
public static Action<AuthenticationTokenReceiveContext> receive = new Action<AuthenticationTokenReceiveContext>(c =>
{
c.DeserializeTicket(c.Token);
c.OwinContext.Environment["Properties"] = c.Ticket.Properties;
});
我正在调用我的接收方法。 AuthenticationTokenReceiveContext附加了我的令牌,但DeserializeTicket返回null。任何人都可以建议我缺少什么来获取此令牌的用户详细信息?
根据以下建议的答案进行更新。 Statrup代码和OAuthBearerAuthenticationOptions现在像这样:
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
private void ConfigureAuth(IAppBuilder app)
{
OAuthOpt = new OAuthBearerAuthenticationOptions()
{
Provider = new CookieOAuthBearerProvider(),
AccessTokenProvider = new AuthenticationTokenProvider()
{
OnReceive = receive
}
};
app.UseOAuthBearerAuthentication(OAuthOpt);
}
public static Action<AuthenticationTokenReceiveContext> receive = new Action<AuthenticationTokenReceiveContext>(c =>
{
var ticket = OAuthOpt.AccessTokenFormat.Unprotect(c.Token);
});
public static OAuthBearerAuthenticationOptions OAuthOpt { get; private set; }
}
但我仍然得到一个空值。我可以在OAuthBearerAuthenticationOptions上遗漏一些相关选项吗?
答案 0 :(得分:4)
试试这个。
将您正在实例化的OAuthBearerAuthenticationOptions
保存到OAuthOpt
中名为Startup.Auth
(或您喜欢的任何内容)的静态变量,并使用下面的代码检索用户信息。
Microsoft.Owin.Security.AuthenticationTicket ticket = Startup.OAuthOpt.AccessTokenFormat.Unprotect(token);`
我建议您使用Json Web Tokens (JWT)
并使用CustomOAuthProvider
自定义令牌生成。 Here是Taiseer Joudeh关于如何做到这一点的好资源。您必须使用此nuget package来解码承载令牌。