2011-12-13 12 views
5

Şu anda DotNetOpenAuth CTP sürümünü kullanan bir OAuth2 yetkilendirme sunucusu geliştiriyorum. Yetkilendirme sunucum asp.net MVC3'te ve kütüphane tarafından sağlanan örneğe dayanıyor. Uygulama, kullanıcının tüketici istemcisine yetki verdiği noktaya ulaşıncaya kadar her şey iyi çalışıyor. Orada yetkilendirme işleminin ilgilenir benim OAuth Kontrolörün içinde bir eylem olduğunu ve numunedeki eşdeğer eylem çok benzerPrepareResponse() AsActionResult() desteklenmeyen özel durumu atar DotNetOpenAuth CTP

:

this.authorizationServer.Channel.PrepareResponse(response).AsActionResult(); 
:

[Authorize, HttpPost, ValidateAntiForgeryToken] 
    public ActionResult AuthorizeResponse(bool isApproved) 
    { 
     var pendingRequest = this.authorizationServer.ReadAuthorizationRequest(); 

     if (pendingRequest == null) 
     { 
      throw new HttpException((int)HttpStatusCode.BadRequest, "Missing authorization request."); 
     } 

     IDirectedProtocolMessage response; 
     if (isApproved) 
     { 
      var client = MvcApplication.DataContext.Clients.First(c => c.ClientIdentifier == pendingRequest.ClientIdentifier); 
      client.ClientAuthorizations.Add(
       new ClientAuthorization 
       { 
        Scope = OAuthUtilities.JoinScopes(pendingRequest.Scope), 
        User = MvcApplication.LoggedInUser, 
        CreatedOn = DateTime.UtcNow, 
       }); 
      MvcApplication.DataContext.SaveChanges(); 
      response = this.authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, User.Identity.Name); 
     } 
     else 
     { 
      response = this.authorizationServer.PrepareRejectAuthorizationRequest(pendingRequest); 
     } 

     return this.authorizationServer.Channel.PrepareResponse(response).AsActionResult(); 
    } 

Program her bu satırı ulaştığında

Sistem, hiçbir araştırma yapmadan başarılı olduğum bir istisna atar. Bunun istisnası şöyledir: Sadece parametreli olmayan kurucular ve başlatıcılar LINQ'dan Entities'e desteklenir.

Yığın izleme: http://pastebin.com/TibCax2t

ben örnekten farklı yaptığım tek şey bir I örnek varlıkları autogenerated bir tasarımcı kullanılarak yapıldı düşünüyorum varlık çerçevenin kod ilk yaklaşımı kullanılır olmasıdır.

Önceden teşekkür ederiz.

+0

Bunu anladınız mı? Aynı problemi alıyorum. – fuzz

cevap

1

Bu,uygulamanızın doğrudan CryptoKey depolamaya çalışıyor olabilir, ancak Entity çerçevesine uygun bir sınıf değil (bir genel varsayılan kurucunun olmaması nedeniyle). Bunun yerine, verileri CryptoKey'da saklamak için kendi varlık sınıfınızı tanımlayın ve ICryptoKeyStore, kalıcılık ve geri alma için iki veri türü arasında geçiş yapmaktan sorumludur.

+0

Duh! Teşekkürler Andrew ... :) – Jammer

5

Örnekte başladıysanız, sorun Andrew'in DatabaseKeyNonceStore.cs numaralı telefondaki durumlarından bahsediyor.

public CryptoKey GetKey(string bucket, string handle) { 
     // It is critical that this lookup be case-sensitive, which can only be configured at the database. 
     var matches = from key in MvcApplication.DataContext.SymmetricCryptoKeys 
         where key.Bucket == bucket && key.Handle == handle 
         select new CryptoKey(key.Secret, key.ExpiresUtc.AsUtc()); 

     return matches.FirstOrDefault(); 
    } 

    public IEnumerable<KeyValuePair<string, CryptoKey>> GetKeys(string bucket) { 
     return from key in MvcApplication.DataContext.SymmetricCryptoKeys 
       where key.Bucket == bucket 
       orderby key.ExpiresUtc descending 
       select new KeyValuePair<string, CryptoKey>(key.Handle, new CryptoKey(key.Secret, key.ExpiresUtc.AsUtc())); 
    } 

Ben sorgunun dışında başlatmaları hareketli çözdüğünüz: istisnası bu iki yöntem üzerinde bir artar

public CryptoKey GetKey(string bucket, string handle) { 
     // It is critical that this lookup be case-sensitive, which can only be configured at the database. 
     var matches = from key in db.SymmetricCryptoKeys 
         where key.Bucket == bucket && key.Handle == handle 
         select key; 

     var match = matches.FirstOrDefault(); 

     CryptoKey ck = new CryptoKey(match.Secret, match.ExpiresUtc.AsUtc()); 

     return ck; 
    } 

    public IEnumerable<KeyValuePair<string, CryptoKey>> GetKeys(string bucket) { 
     var matches = from key in db.SymmetricCryptoKeys 
       where key.Bucket == bucket 
       orderby key.ExpiresUtc descending 
       select key; 

     List<KeyValuePair<string, CryptoKey>> en = new List<KeyValuePair<string, CryptoKey>>(); 

     foreach (var key in matches) 
      en.Add(new KeyValuePair<string, CryptoKey>(key.Handle, new CryptoKey(key.Secret, key.ExpiresUtc.AsUtc()))); 

     return en.AsEnumerable<KeyValuePair<string,CryptoKey>>(); 
    } 

bu en iyi yol olduğunu emin değilim ama Eserleri!

+0

Sadece ... sadece ... teşekkür ederim! – joshcomley

İlgili konular