我刚刚在本教程的基础上构建了一个RESTful服务作为练习。 所以它基本上是在Visual Studio 2013中创建的Web API项目。
我修改了它,以便它返回包含一些地址的JSON字符串。我还编写了一个小型客户端应用程序,它基本上只是读取该字符串并将地址放在屏幕上。
当我创建项目时,我使用个人用户帐户检查了识别。所以我有ApplicationOAuthProvider可用。
从这里开始虽然我有点失落。我发现很多教程都使用某种自我实现的基本身份验证。但是我想尽可能地接近模板项目,直到我完全理解我在做什么。
我请求数据的控制器如下所示:
public IHttpActionResult Get()
{
return Json(db.vwAdressen);
}
使用[授权]过滤器我(当然)得到了一条我未经授权的错误消息,但我不知道这是否是我需要正确实施身份验证的全部内容。当然,发送带有凭据的请求。
答案 0 :(得分:4)
用BasicAuthentication保护我的api。我发现使用Thinktecture.IdentityModel.Owin.Basic Authentication
库是最容易实现的。
从here
获取此nuget包现在在owin
Startup
类中,在configure方法中编写以下语句 -
public void Configuration(IAppBuilder app)
{
app.UseBasicAuthentication("MyAppAuthRealm", ValidateUser);
...
}
...其中ValidateUser
是使用基本身份验证实际验证用户的方法。
然后实现类似这样的ValidateUser
方法 - (为了简单起见,我假设userName和Password对于有效用户是相同的。你有自己的逻辑来验证用户) -
private Task<IEnumerable<System.Security.Claims.Claim>> ValidateUser(string id, string secret)
{
if (id == secret)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, id),
new Claim(ClaimTypes.Role, "Foo")
};
return Task.FromResult<IEnumerable<Claim>>(claims);
}
return Task.FromResult<IEnumerable<Claim>>(null);
}
现在再次在Configuration
方法中,在注册web api配置之前使用以下语句 -
app.UseClaimsTransformation(TransformClaims);
其中TransformClaims
是将声明转换为应用程序标识的方法。
private Task<ClaimsPrincipal> TransformClaims(ClaimsPrincipal incoming)
{
if (!incoming.Identity.IsAuthenticated)
{
return Task.FromResult<ClaimsPrincipal>(incoming);
}
// parse incoming claims - create new principal with app claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.Role, "foo"),
new Claim(ClaimTypes.Role, "bar")
};
var nameId = incoming.FindFirst(ClaimTypes.NameIdentifier);
if (nameId != null)
{
claims.Add(nameId);
}
var thumbprint = incoming.FindFirst(ClaimTypes.Thumbprint);
if (thumbprint != null)
{
claims.Add(thumbprint);
}
var id = new ClaimsIdentity("Application");
id.AddClaims(claims);
return Task.FromResult<ClaimsPrincipal>(new ClaimsPrincipal(id));
}
现在你可以像这样从客户那里打电话给你的api -
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(
X509.CurrentUser
.My
.SubjectDistinguishedName
.Find("CN=client")
.First());
var client = new HttpClient(handler)
{
BaseAddress = new Uri("https://myWebApp/api/")
};
client.SetBasicAuthentication("foo", "foo");
var result = client.GetStringAsync("requestUri").Result;
您可以在此处找到所有者的样本,了解更多详情 - https://github.com/IdentityModel/Thinktecture.IdentityModel/tree/master/samples/OWIN/AuthenticationTansformation