验证Android应用程序以调用web api服务

时间:2014-10-02 15:08:46

标签: android asp.net authentication asp.net-web-api http-authentication

我有一个Android应用程序,其中包含学生的登录表单,我想根据sql server中存储的数据检查web api上的学生凭证

我在网上搜索并观看了许多讨论许多场景的视频,没有任何帮助。

我想要的只是我的休息服务的自定义验证(所以我应该为每个请求发送凭据)

  • 我应该在asp.net web api服务
  • 做什么
  • 我如何在Android应用程序中实现它

2 个答案:

答案 0 :(得分:3)

似乎你没有搜索"基于Web API令牌的身份验证" ;)无论如何,你需要实现的是非常简单的。 您需要使用OAuth 2.0资源所有者凭据流,这意味着您只想为特定端点(即/令牌)提供一次用户名/密码,然后如果用户名/密码有效,您将获得称为承载访问令牌的内容。 此令牌在指定的时间段内有效,您可以在Web API中对其进行配置。 一旦获得访问令牌,您需要将其安全地存储在您的Android应用程序中,然后使用授权标头(承载方案(。)将每次请求发送给您的web api保护端点。 我写了非常详细的帖子,100%覆盖你的情景。请查看帖子Token Based Authentication,如果您需要进一步的帮助,请与我们联系。

答案 1 :(得分:1)

我已经使用基本身份验证来保证安全性,所以我应该提供

的base64编码

username:password

在每个请求的标题中,如下所示

授权:基本'编码的用户名:密码

  httpGet.setHeader("Authorization", "Basic "+encodeUsernameAndPassword());

在服务器端,我实现了消息处理程序

public class BasicAuthenticationHandler : DelegatingHandler
    {
        public readonly IAuthenticationService authService;
        public BasicAuthenticationHandler(IAuthenticationService service)
        {
            this.authService = service;
        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            AuthenticationHeaderValue authHeader = request.Headers.Authorization;
            if (authHeader == null || authHeader.Scheme != "Basic")
            {
                return Unauthorized(request);
            }
            string encodedCredentials = authHeader.Parameter;
            var credentialsBytes = Convert.FromBase64String(encodedCredentials);
            var credentials = Encoding.ASCII.GetString(credentialsBytes).Split(':');

            if (!authService.Authenticate(credentials[0], credentials[1]))
            {
                return Unauthorized(request);
            }

            string[] roles = null;//todo
            IIdentity identity = new GenericIdentity(credentials[0], "Basic");
            IPrincipal user = new GenericPrincipal(identity, roles);


            HttpContext.Current.User = user;


            return base.SendAsync(request, cancellationToken);
        }