1

我想使用 MVC C# WebAPI。

在服务器级别了解谁向您发送请求的最佳方式是什么。例如,如果我收到一个登录请求并且它进行了身份验证,WebAPI 是否应该返回一个服务器需要存储在某处以识别进一步调用的自定义令牌?

如果是这样,令牌是 WebAPI 已经嵌入的东西还是我需要编写的东西?

将该令牌存储在服务器上的推荐方法是什么?理想情况下,我不想使用任何会话。

另外,我不是使用会员的忠实粉丝,原因有很多,我不会在这里说明。

提前致谢。

4

2 回答 2

1

进行身份验证的最佳方式是使用内置系统,但既然您已经说过您不喜欢它们,那么您将不得不接受不是最好的方式。

无论您是否使用成员资格,身份验证在 WebApi 中的工作方式与在 MVC 和 WebForms 中的工作方式相同。您使用 FormsAuthentication cookie,当请求进入时,框架会自动对其进行身份验证。它存储在 HttpContext.Current.User.Identity 对象中。

至少自 .NET 2.0 以来,这并没有(太多)改变,除了改进加密技术。

于 2013-09-25T02:19:28.713 回答
1

我创建了一个开源MVC4 WebAPI 应用程序,它完全按照您所描述的令牌身份验证。你可以在这里找到它WebAPISoup

不是asp.net 会员提供商。使用自定义DelegatingHandler,它只是检查请求标头中是否有有效的App IdToken值,并在允许请求继续之前根据数据库(EF5 代码优先)对其进行验证。

您可以通过在mapHttpRoute中设置处理程序来配置应用程序以全局处理此问题

WebApiConfig.cs

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: HttpClientFactory.CreatePipeline(
                      new HttpControllerDispatcher(config),
                      new DelegatingHandler[] { new Pipeline.AuthMessageHandler() })

        );

AuthMessageHandler

public class AuthMessageHandler : DelegatingHandler
{

    private const string AppIdHeader = "AppId";
    private const string AppTokenHeader = "AppToken";
    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        IEnumerable<string> appIdValues;
        IEnumerable<string> appTokenValues;
        HttpStatusCode responseCode = HttpStatusCode.OK;
        Guid AppIdGuid;
        var DoesHaveAppId = request.Headers.TryGetValues(AppIdHeader, out appIdValues);
        var DoesHaveAppToken = request.Headers.TryGetValues(AppTokenHeader, out appTokenValues);
        //Forces Json to be request Body type
        request.Headers.Accept.Clear();
        request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json");
        IPrincipal principal = null;
        if (DoesHaveAppId && DoesHaveAppToken)
        {
            if (Guid.TryParse(appIdValues.FirstOrDefault(), out AppIdGuid))
            {
                principal = ValidateAuthentication(AppIdGuid, appTokenValues.FirstOrDefault());
                if (principal != null) //Valid User
                {
                    System.Threading.Thread.CurrentPrincipal = principal;
                    if (IsAppOverLimit(AppIdGuid))
                    {
                        responseCode = (HttpStatusCode)429;
                    }
                }
                else//User failed to authenticate
                    responseCode = HttpStatusCode.Unauthorized;
            }
        }
        else//User didn't supply Key/Token
            responseCode = HttpStatusCode.Forbidden;


        return base.SendAsync(request, cancellationToken)
            .ContinueWith(task =>
            {
                var response = task.Result;
                if (responseCode == HttpStatusCode.OK)
                    return response;
                else
                    return request.CreateResponse(responseCode);
            });
    }
}

您可以在此处找到我创建的用于处理令牌身份验证请求的AuthMessageHandler

于 2013-10-03T12:54:16.693 回答