2015-01-12 24 views
16

gönderirken bir Web API'sini C# ile OAuth ile korumak için bir eğiticiyi takip ettim.İade bitiş noktası "Bu istek için yetki reddedildi." taşıyıcı belirteci

Bazı testler yapıyorum ve şu ana kadar erişim kodunu /token'dan başarıyla alabildim. Test etmek için "Gelişmiş REST İstemcisi" adlı bir Chrome uzantısını kullanıyorum.

{"access_token":"...","token_type":"bearer","expires_in":86399} 

Bu geri /token aldığım şeydir. Her şey iyi gözüküyor.

Benim sonraki isteği benim test API Denetleyicisi şudur:

namespace API.Controllers 
{ 
    [Authorize] 
    [RoutePrefix("api/Social")] 
    public class SocialController : ApiController 
    { 
     .... 


     [HttpPost] 
     public IHttpActionResult Schedule(SocialPost post) 
     { 
      var test = HttpContext.Current.GetOwinContext().Authentication.User; 

      .... 
      return Ok(); 
     } 
    } 
} 

istek bir POST ve başlık vardır:

Authorization: Bearer XXXXXXXTOKEHEREXXXXXXX 

alıyorum: JSON döndürülen Authorization has been denied for this request..

Ayrıca bir GET yapmayı denedim ve beklediğim şeyi elde ettim, uygulanmadığımdan beri yöntem desteklenmiyor.

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     using (var repo = new AuthRepository()) 
     { 
      IdentityUser user = await repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       return; 
      } 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "User")); 

     context.Validated(identity); 

    } 
} 

Herhangi bir yardım çok iyi olurdu:

İşte benim Yetkilendirme sağlayıcısıdır. İstek ya da yanlış kod olup olmadığından emin değilim.

düzenlemek

: İşte olan benim Startup.cs

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HttpConfiguration(); 
     WebApiConfig.Register(config); 
     app.UseWebApi(config); 
     ConfigureOAuth(app); 
    } 

    public void ConfigureOAuth(IAppBuilder app) 
    { 
     var oAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = new SimpleAuthorizationServerProvider() 
     }; 

     // Token Generation 
     app.UseOAuthAuthorizationServer(oAuthServerOptions); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

    } 
} 

cevap

27

Sayı oldukça basittir.

public void Configuration(IAppBuilder app) 
{ 
    ConfigureOAuth(app); 
    var config = new HttpConfiguration(); 
    WebApiConfig.Register(config); 
    app.UseWebApi(config); 
} 

Yapılandırmalarınızın OWIN boru hattı siparişi için oldukça önemlidir. Durumunuzda, Web API işleyicinizi OAuth işleyicisinden önce kullanmaya çalışırsınız. İçinde, isteğinizi doğrularsınız, güvenli eylemi bulduğunuzda ve geçerli Owin.Context.User numaralı telefona göre doğrulamaya çalışın. Bu noktada bu kullanıcı mevcut değil, daha sonra çağrılan OAuth Handler ile belirtecin ayarlanmış olması nedeniyle mevcut değil.

+0

WebApi'yi boru hattına kaydetmiyorsanız bunu nasıl yaparsınız? Sadece varsayılan Web API şablonuyla çalışıyorum. GET istekleri iyi çalışıyor, POST istekleri bana 401 veriyor. Jeton aynı. – mwijnands

+1

Bu beni yakaladı! Bu cevabı yayınlamak için zaman ayırdığınız için teşekkür ederiz. – heymega

+0

Bu sorunun nedenini bulmaya çalışırken, refactoring sonrasında birkaç saat harcadım. – Tomino

2

Bu şemaya sahip bir iddiayı eklemek zorunda:

http://schemas.microsoft.com/ws/2008/06/identity/claims/role 
yapılacak

iyi şey iddiaların önceden tanımlanmış set kullanmaktır:

identity.AddClaim(new Claim(ClaimTypes.Role, "User")); 

Seniçinde ClaimTypes bulabilirsiniz 10

sen düşünmek zorundayız başka şey Kontrolörü/Eylem filtre rolleri geçerli:

[Authorize(Roles="User")] 

Basit bir örnek uygulaması, bir jquery istemci here ile Owin kendi kendine barındırılan bulabilirsiniz.

+0

Ekledim: 'identity.AddClaim (yeni hak talebi (ClaimTypes.Role," User ")); Kullanıcının sermaye olması önemli mi? Yorumunuzu görmeden önce bunu ekledim. Bunun önemli olacağını düşünmüyorum. Bağlantınızı kontrol edeceğim. –

+0

Bu bir sabit ve herhangi bir şey olabilir. – LeftyX

+0

Denetleyicimdeki rolü eklemek için 'Authorize] 'i değiştirmeyi denedim, ancak hala yetkilendirmeyi alamıyorum. "Kullanıcı" rolünde yeni bir kullanıcı oluşturdum ve başarılı bir şekilde yeni bir jeton aldım. Yukarıdaki kodu önerilen değişiklikle güncelledi. –

0

Diğer Owin meclisleri ile birlikte mevcut olan "System.IdentityModel.Tokens.Jwt" sürümü düzgün değil gibi görünüyor.

"Microsoft.Owin.Security.Jwt" sürüm 2.1.0 kullanıyorsanız, 3.0.2 sürümünün "System.IdentityModel.Tokens.Jwt" derlemesini kullanmanız gerekir.

paket yöneticisi konsolundan

, deneyin: Owin boru hattı ait Değişim sırası:

Update-Package System.IdentityModel.Tokens.Jwt -Version 3.0.2