如何在服务器上验证Web API访问令牌?

Moh*_*rma 10 asp.net-mvc access-token asp.net-web-api2

一旦WebAPI生成访问令牌,怎么WebAPI验证令牌下一个请求?我想知道我是否可以使用[Authorize]属性,它必须将客户端发送的令牌与服务器端的令牌进行比较,如果存储在某处.它只是检查令牌是否存在而不是它的值?

Leg*_*nds 14

持票人令牌

首先,颁发授权令牌的身份提供者或令牌提供者需要具有与用于加密/解密的Web Api应用程序相同的机器密钥设置:

的<machineKey decryptionKey = "B7EFF1C5839A624ED0268917EDE82F408D2ECBFAC817" 验证= "SHA1" 的validationKey = "C2B8DF31AB9624D8066DFDA1A479542825F3B48865C4E47AF6A026F22D853DEC2B3248DF268599BF89EF78B9E86CA05AC73577E0D5A14C45E0267588850B"/> </system.web>

因为引擎盖Bearertoken使用MachineKey加密.换句话说,如果您没有相同的设置,您的web api将无法解密令牌(验证它).这通过以下方式自动完成:

Microsoft.Owin.Security.OAuth.dll

使用中间件.

如果您希望使用用户名或角色进行简单授权,则可以在Web api控制器/操作上使用授权属性:

[Authorize(Roles="Administrators,Managers",Users ="Mike,Laura")] 
Run Code Online (Sandbox Code Playgroud)

如果您需要自定义授权,则必须实现自定义授权属性,该属性将处理Web api中的自定义授权.如果不允许用户通过,则返回401 UnAuthorized Response:

actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
actionContext.Response.Headers.Add("WWW-Authenticate","Bearer location='http://localhost:8323/account/login'");
Run Code Online (Sandbox Code Playgroud)

例如:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class CustomAuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{
    public RulesExampleEnum[] Rules { get; set; }
    public string Id { get; set; }
    .....
// Summary:
//     Calls when a process requests authorization.
//
// Parameters:
//   actionContext:
//     The action context, which encapsulates information for using System.Web.Http.Filters.AuthorizationFilterAttribute.
public virtual void OnAuthorization(HttpActionContext actionContext);
public virtual Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken);
Run Code Online (Sandbox Code Playgroud)

并在webApiConfig.cs中注册

config.Filters.Add(new CustomAuthorizeAttribute());
Run Code Online (Sandbox Code Playgroud)

并将其应用于Web Api控制器或操作:

[CustomAuthorize(Id = "AnyId", Rules = new RulesExampleEnum[] { RulesExampleEnum.Rule1, RulesExampleEnum.Rule3 })]
public IEnumerable<object> Get()
{...
Run Code Online (Sandbox Code Playgroud)


HBo*_*omb 3

密钥在从客户端到服务器的请求标头中传输,并且在使用 [Authorize] 属性的每个请求中,内容在服务器上进行验证。

您可以使用 Telerik 的 Fiddler(免费)等工具来查看正在传输的数据,但看不到内容(因为它已加密)。使用 MVC / WebAPI 时,检查原始 Web 流量非常有价值,因此我强烈推荐它。这是 Fiddler 的链接,尽管也存在其他类似的工具。

http://www.telerik.com/fiddler

为了回答您问题的第二部分,服务器在允许请求按授权继续进行之前绝对会检查密钥的内容。