0

ユーザー名とパスワードを含む基本認証ヘッダーを使用して、Windows Web API をホストしました。

ユーザー名とパスワードを受け取り、トークンを送り返すログインフォームを作成しようとしています。だから私は次のコードを持っています。

属性メソッドを使用しています

 public class BasicAuthenticationAttribute : System.Web.Http.Filters.ActionFilterAttribute
{

    private IPromiseRepository promiseRepository;


    public BasicAuthenticationAttribute()
    {


        this.promiseRepository = new EFPromiseRepository(new PropellorContext());
        //repository = promiseRepository;
    }

    public BasicAuthenticationAttribute(IPromiseRepository promiseRepository, INewsFeedRepository newsfeedRepository)
    {
        this.promiseRepository = promiseRepository;

    }



    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {

        if (actionContext.Request.Headers.Authorization == null)
        {
            actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        }

        else
        {


            string authToken = actionContext.Request.Headers.Authorization.Parameter;

            string decodedToken = authToken;
            //    Encoding.UTF8.GetString(Convert.FromBase64String(authToken));

            string username = decodedToken.Substring(0, decodedToken.IndexOf(":"));
            string password = decodedToken.Substring(decodedToken.IndexOf("^")+1);
            string APIToken = decodedToken.Substring(decodedToken.IndexOf("="));
            APIToken = APIToken.Replace("=", string.Empty);

            password = password.Replace("=", string.Empty);


            if (!string.IsNullOrEmpty(APIToken))
            {
                password = password.Replace(APIToken, string.Empty);
            }



            if (username != null && password != null)
            {
                try
                {
                    var user = promiseRepository.GetUserByName(username);
                    var salt = user.PasswordSalt;

                    System.Security.Cryptography.SHA512Managed HashTool = new System.Security.Cryptography.SHA512Managed();
                    Byte[] PasswordAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(password, salt));
                    Byte[] EncryptedBytes = HashTool.ComputeHash(PasswordAsByte);
                    HashTool.Clear();
                    var hashedpass = Convert.ToBase64String(EncryptedBytes);


                    if (hashedpass == user.Password)
                    {

                        if (string.IsNullOrEmpty(user.APIToken))
                        {
                            String guid = System.Guid.NewGuid().ToString();
                            user.APIToken = guid;
                            promiseRepository.UpdateUser(user);
                            promiseRepository.Save();
                        }


                        if (user != null)
                        {

                            user = promiseRepository.GetUserByUserID(user.UserID);
                            HttpContext.Current.User = new GenericPrincipal(new ApiIdentity(user), new string[] { });


                            base.OnActionExecuting(actionContext);
                        }

                    }

                    if (APIToken != null)
                    {
                        if (user.APIToken == APIToken)
                        {
                            var userbytoken = promiseRepository.GetUserByAPIToken(APIToken);
                            HttpContext.Current.User = new GenericPrincipal(new ApiIdentity(userbytoken), new string[] { });


                            base.OnActionExecuting(actionContext);
                        }
                    }

                }


                catch (Exception)
                {

                    {
                        actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
                        base.OnActionExecuting(actionContext);
                    }
                    throw;
                }








            }



        }


    }



    }

これは、正しい資格情報が渡された場合に Fiddler で機能します

Windows Phone アプリケーションで同じ認証を作成しようとしています。

ユーザー名とパスワードを基本認証 http ヘッダーに渡します。

ただし、インターネットで大量に掘り下げた後、これを行う方法がわかりません。例の多くはWindows Phone 7であり、特定の方法はもう存在しません。

これが私がたどり着いたコードです。

private void Login1_Click(object sender, RoutedEventArgs e)

    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:5650/api/start");

        NetworkCredential credentials = new NetworkCredential(userName.Text + ":^",password.Text + "=");
        request.Credentials = credentials;

        request.BeginGetResponse(new AsyncCallback(GetSomeResponse), request);

うまくいけば、誰かが私を正しい方向に導くことができます。原則として単純でなければなりません:(

4

1 に答える 1