我已将Web API 2项目配置为使用OWIN
使用OAuth public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app)
{
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new MyAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
MyAuthorizationServerProvider的实现:
public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var repo = new AuthRepository();
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var user = repo.ValidateUserCredentials(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
我能得到一个令牌..
然后我将它发送到装有[Authorized]
并仍然获得
{
"message": "Authorization has been denied for this request."
}
带有令牌的请求标头:
Content-Type:application/json
Authorization:Bearer m6ukGHOmp_MgM6rsb70n8Rd_BlBEXbgyPNr5ZNzGzkm__7zdntVPYAMAhFPXVdw1S6-ohv960c6mzMMwkY0G_AL-2uIq2aOjkoojxDPKuITuml8sgC4ng0KC2AqUFrBBEn0eCsSAnc3UK_jyKSB59Ao_eL9JPoJHoJHP-xBs42KGAGl4iKdYtzdfg2zY0Ucif_IpPH3Gbvs6iyLVMf0jlKgj4EOBtrDHanikeqkWc0W2pWjIIac8cyUrOtZCj7h3
我在这里做错了什么?
另外..想知道..令牌存放在哪里? Web API如何验证收到的令牌是否附加到相关用户?
我是否错过了某些令牌商店类的自定义实现?如果是这样,我在哪里可以找到有关如何实现自定义令牌存储的信息?
答案 0 :(得分:0)
令牌不存储在任何地方,它只是一个编码的数据位,当你在另一边收到它时,你可以从中提取信息。
验证发生在ValidateClientAuthentication方法中。您只需将上下文设置为经过身份验证,而不进行任何检查。这是您检查ClientID / Client Secret组合是否正确的地方,名称也表示。你可以在那里添加额外的东西。
我个人不会将OAuth2用于用户级别的身份验证,但如果您需要,则不会阻止您执行此操作。我更喜欢保持令牌应用程序相关,而不是用户相关,但这只是我的偏好。
GrantResourceOwnerCredentials在invalid_grant上设置上下文错误?该授权与您尝试传递的用户名/密码无关。您只在请求令牌时设置grant_type,它通常是password类型。 invalid_grant意味着你正在尝试不同的授权类型,而且根本不清楚你的代码。
您还没有向我们展示您的令牌格式类,如何创建它,您放入哪些信息等等。
另外,有一点我注意到你正在使用
使用OAuthBearerAuthentication - 使用空选项 并且 UseOAuthAuthorizationServer。
最后一个应该足够我想。我在使用OAuth2时使用过JWT,但看起来你实际上并没有使用它。 为了说实话,代码看起来有点遍布。
我想知道你是否介意用足够的代码创建一个repo来复制问题。
今晚我会试着看看,看看我是否可以复制这个问题。欢迎你今天晚些时候在推特上打我。