自定义身份验证属性Xamarin Froms

时间:2016-12-26 12:37:12

标签: c# asp.net-web-api attributes xamarin.forms owin

我在我的Xamarin Froms应用程序中使用我的Owin auth提供程序和API服务以及RESTful控制器。

我已经有登录方法和测试页。

我想在xamarin表单中使用一些动作过滤器属性。

在我的第一页上,名为TestPage i use,XAML view:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MCHS.MobileApp.Views.TestPage">
  <Label Text="Test" VerticalOptions="Center" HorizontalOptions="Center" x:Name="TestMessageContainer"/>
</ContentPage>

和此页面的代码:

[Authentication]
    public partial class TestPage : ContentPage
    {

        public TestPage()
        {
            InitializeComponent();

            var response = App.client.GetAsync(LoginModel.ApiUrl+ "/api/test/get?id=5").Result;

            var content = response.Content.ReadAsStringAsync().Result;

            this.TestMessageContainer.Text = content;
        }
    }

在此服务中我使用身份验证自定义属性,此属性必须执行某些应用程序逻辑并接受方法或在另一个页面视图上重定向用户(LoginPage)

我这样使用它:

 public class Authentication : Attribute
    {
        public Authentication()
        {

            //get device account info
            Account account = AccountStore.Create().FindAccountsForService(App.AppName).FirstOrDefault();

            //Check if access token in account
            if (!string.IsNullOrEmpty(account.Properties["AccessToken"]))
            {
                //check token for expire
                if (DateTime.Parse(account.Properties["ExpiresIn"]) > DateTime.Now)
                {
                    new Authorization(new LoginModel()
                    {
                        Login = account.Username
                    });
                 }


                using (App.client)
                {
                    //New requset option
                    var form = new Dictionary<string, string>
                    {
                        { "grant_type", "refresh_token"},
                        { "refresh_token", account.Properties["RefreshToken"]}
                    };

                    var uri = new Uri(String.Format(LoginModel.ApiUrl + "token"));

                    //get response fo refreshed token
                    var tokenResponse = App.client.PostAsync(uri, new FormUrlEncodedContent(form)).Result;

                    //Reinitialize static object for token response
                    App.ResponseToken = tokenResponse.Content.ReadAsAsync<TokenModel>(new[] { new JsonMediaTypeFormatter() }).Result;

                    account.Properties.Add("AccessToken", App.ResponseToken.GetType().GetRuntimeProperty("AccessToken").GetValue("AccessToken").ToString());
                    account.Properties.Add("RefreshToken", App.ResponseToken.GetType().GetRuntimeProperty("RefreshToken").GetValue("RefreshToken").ToString());
                    account.Properties.Add("ExpiresIn", App.ResponseToken.GetType().GetRuntimeProperty("ExpiresIn").GetValue("ExpiresIn").ToString());

                    App.client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",
                    App.ResponseToken.GetType().GetRuntimeProperty("AccessToken").GetValue("AccessToken").ToString());
                    App.client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                }
            }

            new Authorization(new LoginModel());
        }

    }

现在问题。

然后我初始化我的应用程序,他加载TestPage,但不控制身份验证自定义属性,我的系统忽略它。 我做错了什么?

0 个答案:

没有答案