曾几何时我曾经安装Thinktecture.IdentityModel
,使用基本身份验证调用它来获取令牌,然后将其传递给ajax调用Web API的标头。
我只是试图这样做,并且它被禁止了。
找不到方法:ctor签名不匹配(为Fiddler欢呼)。
与 工作的项目进行比较显示,System.IdentityModel.Tokens.Jwt
版本2.0.0.0中存在所需的签名,但版本4.0中不再存在该签名.20622.1351
有一个github支持查询on this very topic并在我们发现的评论中
leastprivilege于1月27日发表评论
AuthenticationHandler不再是推荐的方法 Web API v2,因为现在一切都是内置的 - 使用中间件。
这是一个明确的意见。他是图书馆作者之一。对于需要提出问题的人来说,这也是非常无益的。
有人可以指出我适当的介绍和教程链接,这样我就可以加入那些狡猾地点头的人的行列,并对这篇评论的禅宗简洁感到惊叹吗?
我使用AuthenticationHandler来验证包含用户名和密码的SQL Server表。纯粹主义者请不要告诉我,有无数的企业不会或不会使用第三方OAUTH。我需要将用户名/密码对转换为我可以在我的Web API方法上使用的会话令牌。这就是全部。我碰巧同意OAUTH,但支付费用的人对大型统一身份验证不感兴趣,他们喜欢孤岛。
我在整个身份验证上找到了publically accessible PluralSight course。由编写ThinkTecture.AuthenticationHandler的人编写,作为近期变更的背景资料,它非常好。
在材料的过程中,他引用another PluralSight course on MVC,其中information on OWIN(纯API即接口)和Katana(这是Microsoft的实现) OWIN)。
此时我很清楚
MessageHandler
不是进行身份验证的地方。我对新景观的模糊理解表明中间件包是我需要的。 NuGet做了它的事情,现在我必须提供一些代码来将中间件插入到OWIN中间件链中,并提供更多代码来实际验证凭据。尽可能接近我需要在Startup.Auth.cs中执行此操作
public void ConfigureAuth(IAppBuilder app)
{
app.UseBasicAuthentication("some_realm", (id, secret) =>
{
if (id == secret) //should check database, but never mind right now
{
var claims = new List<Claim> {
new Claim(ClaimTypes.NameIdentifier, id),
new Claim(ClaimTypes.Role, "Foo") //this can come from db also
};
return Task.FromResult<IEnumerable<Claim>>(claims);
}
return Task.FromResult<IEnumerable<Claim>>(null);
});
假设到目前为止我已经做到了这一点,我该如何使用它?我是否继续使用[Authorize]
?
目前,来自我的测试客户端的请求导致我在行if (id == secret)
上设置的断点命中,并且条件得到满足,因为id和secret包含我的测试代码发送的值。声明对象是根据上面的代码创建并正式返回的,但测试客户端收到401 Unauthorized。
这几乎可以肯定是由于无法创建主体对象。使用UserManager和IdentityModel进行了一些业务,并且可以自定义它以使用我们自己的架构。