首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET网络应用编程接口中的用户身份验证

ASP.NET网络应用编程接口中的用户身份验证
EN

Stack Overflow用户
提问于 2012-07-31 08:50:18
回答 3查看 118.3K关注 0票数 151

这个话题让我感到难以置信的困惑。我是一个新手在超文本传输协议应用程序,但需要开发一个iPhone客户端,从某个地方消费JSON数据。我选择了微软的Web API,因为它看起来很简单,但当涉及到用户身份验证时,事情就变得相当令人沮丧。

我很惊讶,在谷歌搜索了几个小时之后,我竟然找不到一个清晰的示例来说明如何从登录屏幕一直到在我的ApiController方法上使用Authorize属性。

这不是一个问题,而是一个如何准确做到这一点的示例的请求。我看过以下几页:

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

有人愿意写一个很好的简单的例子或者给我指出正确的方向吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-31 10:32:49

我很惊讶,在经过几个小时的Googling搜索之后,我竟然找不到一个清晰的示例来说明如何从登录屏幕到在我的ApiController方法上使用Authorize属性来验证用户身份。

这是因为你把这两个概念搞混了:

  • Authentication是系统可以安全地识别其用户的机制。身份验证系统提供了以下问题的答案:

- Who is the user?
- Is the user really who he/she represents himself to be?

  • 授权是一种机制,系统通过该机制确定特定的经过身份验证的用户对系统控制的受保护资源的访问权限级别。例如,数据库管理系统可以被设计成向某些特定的个人提供从数据库中检索信息的能力,而不是改变存储在数据库中的数据的能力,同时给予其他个人改变数据的能力。授权系统提供了问题的答案:

- Is user X authorized to access resource R?
- Is user X authorized to perform operation P?
- Is user X authorized to perform operation P on resource R?

MVC中的Authorize属性用于应用访问规则,例如:

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

上述规则将仅允许管理员和超级用户角色中的超级用户访问方法

还可以使用location元素在web.config文件中设置这些规则。示例:

  <location path="Home/AdministratorsOnly">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

但是,在执行这些授权规则之前,您必须对当前网站的进行身份验证。

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

从这里开始,我们可以将问题一分为二:

在同一个Web应用程序中使用Web服务时的

  • Authenticate用户

这将是最简单的方法,因为您将依赖于Authentication in ASP.Net

这是一个简单的例子:

Web.config

用户将被重定向到帐户/登录路由,在那里您将呈现自定义控件以请求用户凭据,然后您将使用以下命令设置身份验证cookie:

if (ModelState.IsValid) { if (Membership.ValidateUser(model.UserName,model.Password)) {Membership.ValidateUser model.RememberMe);return RedirectToAction(“索引”,“主页”);} else { ModelState.AddModelError("",“提供的用户名或密码不正确。”);}} //如果到目前为止,有些东西失败了,重新显示表单返回View(model);

  • Cross - platform身份验证

这种情况发生在您仅在Web应用程序中公开Web服务时,因此,您将有另一个客户端使用这些服务,该客户端可以是另一个Web应用程序或任何.Net应用程序(Win窗体、WPF、控制台、Windows服务等)

例如,假设您将使用来自同一网络域(在intranet内)上的另一个Web应用程序的web API服务,在这种情况下,您可以依赖于ASP.Net提供的Windows身份验证。

如果您的服务在Internet上公开,则需要将经过身份验证的令牌传递给每个Web API服务。

有关更多信息,请访问以下文章:

- [http://stevescodingblog.co.uk/basic-authentication-with-asp-net-webapi/](http://stevescodingblog.co.uk/basic-authentication-with-asp-net-webapi/)
- [http://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/](http://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/)

票数 176
EN

Stack Overflow用户

发布于 2013-09-13 07:24:01

如果您希望在没有授权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;
}
票数 15
EN

Stack Overflow用户

发布于 2014-02-17 00:36:11

我正在处理一个MVC5/Web API项目,需要能够获得Web Api方法的授权。当我的索引视图第一次加载时,我调用了一个'token‘Web方法,我相信它是自动创建的。

获取令牌的客户端代码(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 }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11731683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档