2015-05-13 24 views
11

Hem istemcileri hem de kaynak sahiplerini doğrulamak için OAuthAuthorizationServerProvider türettim. Ben kaynak sahiplerini doğrulamak zamanJeton isteğini reddederken OWIN/OAuth HTTP durum kodunu özelleştirme

ben context.Rejected(), arayıp HTTP/401 Yetkisiz beklenirken HTTP yanıtı HTTP/400 Geçersiz İstek durum koduyla birlikte gelir, onların kimlik bilgileri geçerli değildir bulabilirsiniz.

OAuthAuthorizationServerProvider adlı kişinin yanıtını HTTP nasıl kodlayabilirim?

cevap

12

OwinMiddleware'i nasıl geçersiz kılıyoruz ... ilk olarak kendi ara yazılımımızı Owin'in üzerine yarattık ... Sanırım yaptığınız gibi benzer bir sorun yaşadık. Bir sabiti oluşturmak için

İlk gerek: startup.Auth dosyasında OwinMiddleware

public class AuthenticationMiddleware : OwinMiddleware 
{ 
    public AuthenticationMiddleware(OwinMiddleware next) : base(next) { } 

    public override async Task Invoke(IOwinContext context) 
    { 
     await Next.Invoke(context); 

     if (context.Response.StatusCode == 400 && context.Response.Headers.ContainsKey(Constants.OwinChallengeFlag)) 
     { 
      var headerValues = context.Response.Headers.GetValues(Constants.OwinChallengeFlag); 
      context.Response.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault()); 
      context.Response.Headers.Remove(Constants.OwinChallengeFlag); 
     } 

    } 
} 

public class Constants 
{ 
    public const string OwinChallengeFlag = "X-Challenge"; 
} 

Ve geçersiz, biz

public void ConfigureAuth(IAppBuilder app) 
    .... 
     app.Use<AuthenticationMiddleware>(); //Allows override of Invoke OWIN commands 
    .... 

    } 
Komutları

çağırır Owin ait overrid izin

Ve ApplicationOAuthProvider'da, GrantResourceOwnerCredentials'ı değiştirdik.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     using (UserManager<IdentityUser> userManager = _userManagerFactory()) 
     { 
      IdentityUser user = await userManager.FindAsync(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       context.Response.Headers.Add(Constants.OwinChallengeFlag, new[] { ((int)HttpStatusCode.Unauthorized).ToString() }); //Little trick to get this to throw 401, refer to AuthenticationMiddleware for more 
       //return; 
      } 
      .... 
+0

Bunu yarın denerim ve eğer işe yaradıysa size onaylayacağım !! Şimdiden teşekkür ederim;) –

+0

Hey, yaklaşımınızı deniyorum ve sorunları buluyorum. Sanırım "STTIAuthenticationMiddleware", AuthenticationMiddleware'dir ve asıl meselem, özel middleware'in hiç pipeline sırasında çağrılmamasıdır. Middleware'i 'app.Use ()' ve 'app.Use (System.Type)' kullanarak yapılandırdım. Sorun nedir? –

+0

Evet, ilk kısımda, bunlar aynı. Diğer taraftan, startup.auth'un ConfigureAuth'u çağırdığını ve ayarlamayı doğruladınız mı? –

İlgili konular