2017-08-02 22 views
1

MVCとWeb APIでユーザーインターフェイスを準備します。 OWINによるWeb APIの承認は正しいです。ログインメソッドでは、Web APIにログオンして情報トークンなどを取ることができますが、Web APIからこの自動化をインポートしてMVCのInterfaceに追加することは可能ですか?そうなら、それを行う方法?ユーザーインターフェイスのOWIN Web API承認

例えば

public static class WebApiAuthorizationHelper 
    { 

     public static string GetToken(string url, string userName, string password) 
     { 
      var pairs = new List<KeyValuePair<string, string>> 
        { 
         new KeyValuePair<string, string>("grant_type", "password"), 
         new KeyValuePair<string, string>("username", userName), 
         new KeyValuePair<string, string> ("Password", password) 
        }; 
      var content = new FormUrlEncodedContent(pairs); 
      ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
      using (var client = new HttpClient()) 
      { 
       var response = client.PostAsync(url + "Token", content).Result; 
       return response.Content.ReadAsStringAsync().Result; 
      } 
     } 

     public static string CallApi(string url, string token) 
     { 
      ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
      using (var client = new HttpClient()) 
      { 
       if (!string.IsNullOrWhiteSpace(token)) 
       { 
        var t = JsonConvert.DeserializeObject<Token>(token); 

        client.DefaultRequestHeaders.Clear(); 
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.access_token); 
       } 
       var response = client.GetAsync(url).Result; 
       return response.Content.ReadAsStringAsync().Result; 
      } 
     } 

     class Token 
     { 
      public string access_token { get; set; } 
      public string token_type { get; set; } 
      public int expires_in { get; set; } 
      public string userName { get; set; } 
      [JsonProperty(".issued")] 
      public string issued { get; set; } 
      [JsonProperty(".expires")] 
      public string expires { get; set; } 
     } 

    } 
:mvcUI.User = WebAPI.User

私も使用したい* [承認]は、mvcUI

enter image description here

使用WebApiAuthorizationHelperコードで主張します

+1

私たちは同様のセットアップを持っていると思います。トークンをMVC側でデコードし、その主張を読み、MVC側でクッキー認証を使用することで、必要なものを実現できます。 MVC側のクッキーに同じトークン値を格納すると、[Authorize]属性を使用できるようになります。セキュリティはクッキーによって行われますが、jwtトークンによって直接的に行われます。 – Verthosa

答えて

2

以下のコードでトークンに情報を追加できます。

マイCustomIdentityService

public class CustomIdentityService 
{ 
    protected MyContext _context = new MyContext(); 

    public Guid FooInfo(Guid IdentityUserID) 
    { 
    return con.fooTable.Where(x => x.IdentityUserID == IdentityUserID). 
    Select(us => new { us.fooData }).FirstOrDefault().fooData; 
    } 
} 

プロバイダ/ ApplicationOAuthProvider.cs

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

    CustomIdentityService _customIdentityService = new CustomIdentityService(); 

    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,OAuthDefaults.AuthenticationType); 
    ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,CookieAuthenticationDefaults.AuthenticationType); 

    //Add custom claims code 
    string fooInfo= _customIdentityService.FooInfo(user.Id)); 
    oAuthIdentity.AddClaim(new Claim("fooInfo", fooInfo)); 
    AuthenticationProperties properties = CreateProperties(user.UserName,fooInfo); 

    } 

    public static AuthenticationProperties CreateProperties(string userName,string fooInfo) 
    { 
     IDictionary<string, string> data = new Dictionary<string, string> 
    { 
     { "fooInfo", fooInfo }, 
     { "userName", userName } 
    }; 
     return new AuthenticationProperties(data); 
    } 
+0

@Verthosaがhttp://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1を書くときに解決策を見つけましたが、あなたの答えも正しいです –

関連する問題