.NET Web API 应用程序的令牌和用户身份验证

16 浏览
0 Comments

.NET Web API 应用程序的令牌和用户身份验证

我需要开发一个iPhone客户端,从某处获取JSON数据。我选择了微软的Web API,因为它看起来相当简单,但是当涉及到验证用户时,事情变得相当令人沮丧。

令我惊讶的是,在经过几个小时的谷歌搜索后,我竟然找不到一个清晰的示例,说明如何从登录界面开始验证用户,然后在我的ApiController方法上使用Authorize属性。

这不是一个问题,而是一个请求,请求提供一个确切的示例。我查看了以下页面:

尽管这些页面解释了如何处理未经授权的请求,但它们并没有清楚地演示类似LoginController这样的东西来请求用户凭据并进行验证。

任何愿意提供一个简单明了的示例或指导我正确方向的人,请帮帮忙吗?

0
0 Comments

在我正在进行的MVC5/Web API项目中,我需要为Web API方法获取授权。当我的主页视图首次加载时,我调用了自动生成的“token”Web API方法。

获取令牌的客户端代码(CoffeeScript)如下:

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

如果成功,将调用以下方法,将认证令牌保存在本地:

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

然后,如果我需要对带有[Authorize]标签的Web API方法进行Ajax调用,我只需向Ajax调用添加以下头信息:

{ "Authorization": "Bearer " + window.authenticationToken }

response.access_token是从哪里来的?你是在C#代码中设置它吗..?

'response'对象是通过'token'方法返回的。

我还没有研究过角色。这种方法只是为了给您一个访问令牌,以便您可以调用带有[Authorize]标签的WebApi方法。可以假设,当您调用这些方法中的任何一个时,您可以检查角色。可以参考stackoverflow.com/questions/19689570

那么在这个解决方案中,您实际上是在哪里对用户进行认证的呢?

对于任何新的Web API项目,/token端点都会自动创建。在这个端点的代码中,用户被认证。如果您将Web API控制器添加到现有的MVC项目中,情况会稍微复杂一些。

0
0 Comments

问题:.NET Web API 应用程序令牌和用户身份验证的原因和解决方法

在使用用户名和密码进行身份验证并且没有授权cookie的情况下,MVC4的Authorize属性无法直接使用。但是,可以在控制器中添加以下辅助方法,以接受基本身份验证头。在控制器的方法中从一开始调用该方法。

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

从客户端的角度来看,这个辅助方法创建一个带有身份验证头的HttpClient:

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}

只是想评论一下,我正在寻找一种简单的方法来使用行业标准在头部传递凭据。这个示例展示了服务器端和客户端的基础知识,正是我需要的。

解决方法:将上述的辅助方法添加到控制器,并在需要进行身份验证的方法中调用`EnsureAuthenticated`方法。从客户端创建HttpClient时,使用`CreateBasicAuthenticationHttpClient`方法来设置身份验证头。

这样,就可以使用用户名和密码进行身份验证,并且不需要授权cookie。如果验证失败,将抛出`HttpResponseException`异常。

文章完整内容如下:

如果您想使用用户名和密码进行身份验证,并且不使用授权cookie,MVC4的Authorize属性无法直接使用。但是,可以在控制器中添加以下辅助方法,以接受基本身份验证头。在控制器的方法中从一开始调用该方法。

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

从客户端的角度来看,这个辅助方法创建一个带有身份验证头的HttpClient:

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}

只是想评论一下,我正在寻找一种简单的方法来使用行业标准在头部传递凭据。这个示例展示了服务器端和客户端的基础知识,正是我需要的。

使用方法:将上述的辅助方法添加到控制器,并在需要进行身份验证的方法中调用EnsureAuthenticated方法。从客户端创建HttpClient时,使用CreateBasicAuthenticationHttpClient方法来设置身份验证头。

这样,就可以使用用户名和密码进行身份验证,并且不需要授权cookie。如果验证失败,将抛出HttpResponseException异常。

0
0 Comments

.NET Web API应用程序的令牌和用户身份验证问题是由于在登录屏幕上到使用Authorize属性覆盖ApiController方法之间的过程中,找不到明确的示例而导致的。这个问题的原因是对身份验证和授权的概念混淆。身份验证是系统可以安全地识别其用户的机制,而授权是系统确定特定经过身份验证的用户对系统控制的受保护资源应具有的访问级别的机制。在MVC中使用的Authorize属性是应用访问规则的机制。在处理未经授权的请求之前,必须进行身份验证。在同一Web应用程序中使用Web API服务时,可以使用ASP.NET的身份验证机制,通过Web.config文件中的authentication元素设置身份验证模式。而在跨平台身份验证的情况下,可以使用Windows身份验证,或者通过在Web API服务中传递经过身份验证的令牌。关于如何控制令牌的篡改和过期,可以在令牌中包含调用者的IP地址,并在身份验证事件中验证。然而,没有SSL的情况下,没有真正的方法可以避免会话劫持。最后,这个问题是关于ASP.NET Web API的,而不是ASP.NET MVC。

0