RESTful服务基本身份验证

时间:2016-03-31 11:14:40

标签: c# rest

我刚刚在本教程的基础上构建了一个RESTful服务作为练习。 所以它基本上是在Visual Studio 2013中创建的Web API项目。

我修改了它,以便它返回包含一些地址的JSON字符串。我还编写了一个小型客户端应用程序,它基本上只是读取该字符串并将地址放在屏幕上。

当我创建项目时,我使用个人用户帐户检查了识别。所以我有ApplicationOAuthProvider可用。

从这里开始虽然我有点失落。我发现很多教程都使用某种自我实现的基本身份验证。但是我想尽可能地接近模板项目,直到我完全理解我在做什么。

我请求数据的控制器如下所示:

public IHttpActionResult Get()
{
    return Json(db.vwAdressen);
}

使用[授权]过滤器我(当然)得到了一条我未经授权的错误消息,但我不知道这是否是我需要正确实施身份验证的全部内容。当然,发送带有凭据的请求。

1 个答案:

答案 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