这个话题让我感到难以置信的困惑.我是HTTP应用程序的新手,但需要开发一个从某个地方使用JSON数据的iPhone客户端.我 Select 了微软的WebAPI,因为它看起来很简单,但当涉及到用户身份验证时,事情就变得相当令人沮丧.

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

这不是一个问题,而是请求一个具体如何做到这一点的例子.我看过以下几页:

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

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

谢谢.

推荐答案

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

那是因为你混淆了这两个概念:

  • 身份验证是一种机制,通过这种机制,系统可以安全地识别其用户.认证系统提供了以下问题的答案:

    • 用户是谁?
    • 用户真的是他/她所说的那个人吗?
  • 授权是一种机制,通过这种机制,系统可以确定特定身份验证用户对系统控制的安全资源的访问级别.例如,数据库管理系统的设计可以使某些特定的个人能够从数据库中检索信息,但不能更改数据库中存储的数据,同时使其他个人能够更改数据.授权系统提供以下问题的答案:

    • 用户X有权访问资源R吗?
    • 用户X是否有权执行操作P?
    • 用户X是否有权对资源R执行操作P?

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

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

上述规则将只允许users in the Admin and Super User roles to access the method

这些规则也可以在网上设置.配置文件,使用location元素.例子:

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

然而,在执行这些授权规则之前,你必须是authenticated to the current web site岁.

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

从这里,我们可以将问题分为两部分:

  • 在同一Web应用程序中使用Web API服务时对用户进行身份验证

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

    这是一个简单的示例:

    网状物配置

    <authentication mode="Forms">
      <forms
        protection="All"
        slidingExpiration="true"
        loginUrl="account/login"
        cookieless="UseCookies"
        enableCrossAppRedirects="false"
        name="cookieName"
      />
    </authentication>
    

    用户将被重定向到account/login路径,在那里您将呈现自定义控件以请求用户凭据,然后您将使用以下方法设置身份验证cookie:

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    
  • 跨平台认证

    这种情况下,当你only exposing Web API services within the Web application岁时,你会有另一个客户机使用这些服务,该客户机可能是另一个Web应用程序或任何其他应用程序.Net应用程序(Win窗体、WPF、控制台、Windows服务等)

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

    <authentication mode="Windows" />
    

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

    有关更多信息,请浏览以下文章:

Asp.net相关问答推荐

ASP.NET MVC forEach 循环仅返回 1 个值

ReportViewer 控件 - 高度问题

ASP.NET Response.Redirect 使用 302 而不是 301

ASP.NET 控件无法在 Visual Studio 2008 的代码隐藏中引用

将 null 转换为字符串的函数

如何使图像的一部分成为可点击的链接

如何计算/查找给定日期的周数?

Twitter bootstrap glyphicons 不会出现在发布模式 404 中

Devexpress 或 Telerik Controls 比较

每月的每一天

Eval()、XPath() 和 Bind() 等数据绑定方法只能在数据绑定控件的上下文中使用

如何针对异常需求自定义 ASP.NET Web API AuthorizeAttribute

单击按钮时播放哔声

使用 VirtualPathProvider 从 DLL 加载 ASP.NET MVC 视图

Twitter Bootstrap 和 ASP.NET GridView

主机与 DnsSafeHost

在 ASP.NET 标识中添加角色

在.net的内存数据库中

Visual Studio 2013 ASP.NET 项目中 Antlr 包的用途是什么?

Appdomain 回收究竟是什么