2013-12-16 8 views
9

मैं वीएस 2013 में एएसपी.नेट के लिए डिफ़ॉल्ट एकल पृष्ठ एप्लिकेशन टेम्पलेट में संशोधन करना चाहता हूं, जो वर्तमान में बेयरर टोकन प्रमाणीकरण का उपयोग करता है। नमूना उसी ऐप में अनुरोधों के लिए टोकन को सत्यापित करने के लिए टोकन सर्वर और मिडलवेयर दोनों बनाने के लिए app.UseOAuthBearerTokens का उपयोग करता है।ओविन बहु-ऐप भालू टोकन प्रमाणीकरण

मैं जो करना चाहता हूं वह उस स्थान पर छोड़ देता है, लेकिन एक दूसरा एप्लीकेशन (एक ही डोमेन में आईआईएस में बाध्य, अलग पथ - उदाहरण के लिए/auth/* प्रमाणीकरण सर्वर के लिए, और/app1/* के लिए अप्प)। दूसरे ऐप के लिए, मैं चाहता हूं कि यह पहले ऐप में प्रमाणीकरण सर्वर द्वारा जारी टोकन स्वीकार करे। यह कैसे पूरा किया जा सकता है? मैं Startup.Auth.cs सिर्फ UseOAuthBearerTokens में कोड के बंद जा रहा में निम्नलिखित की कोशिश की है, लेकिन मैं [अधिकृत] विशेषता के साथ किसी भी अनुरोध करने के लिए 401 प्रतिक्रियाएं मिलती है:

public partial class Startup 
{ 
    static Startup() 
    { 
     PublicClientId = "self"; 

     UserManagerFactory =() => new UserManager<IdentityUser>(new UserStore<IdentityUser>()); 

     OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      //TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), 
      //AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      //AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
      AuthenticationType = "ExternalBearer", 
      AllowInsecureHttp = true, 
     }; 
    } 

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

    public static Func<UserManager<IdentityUser>> UserManagerFactory { get; set; } 

    public static string PublicClientId { get; private set; } 

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     //// Enable the application to use a cookie to store information for the signed in user 
     //// and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     //app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     //app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     OAuthBearerAuthenticationOptions bearerOptions = new OAuthBearerAuthenticationOptions(); 
     bearerOptions.AccessTokenFormat = OAuthOptions.AccessTokenFormat; 
     bearerOptions.AccessTokenProvider = OAuthOptions.AccessTokenProvider; 
     bearerOptions.AuthenticationMode = OAuthOptions.AuthenticationMode; 
     bearerOptions.AuthenticationType = OAuthOptions.AuthenticationType; 
     bearerOptions.Description = OAuthOptions.Description; 
     bearerOptions.Provider = new CustomBearerAuthenticationProvider(); 
     bearerOptions.SystemClock = OAuthOptions.SystemClock; 
     OAuthBearerAuthenticationExtensions.UseOAuthBearerAuthentication(app, bearerOptions); 
    } 
} 

public class CustomBearerAuthenticationProvider : OAuthBearerAuthenticationProvider 
    { 
     public override Task ValidateIdentity(OAuthValidateIdentityContext context) 
     { 
      var claims = context.Ticket.Identity.Claims; 
      if (claims.Count() == 0 || claims.Any(claim => claim.Issuer != "LOCAL AUTHORITY")) 
       context.Rejected(); 
      return Task.FromResult<object>(null); 
     } 
    } 

जाहिर है मैं हिस्सा है जहां याद कर रहा हूँ दूसरे ऐप में यह सत्यापित करने का कोई तरीका है कि टोकन पहले ऐप से आए थे। किसी तरह की सार्वजनिक हस्ताक्षर कुंजी?

यह केवल अवधारणा के सबूत के लिए है।

संपादित करें: मशीन कुंजी सुझाव पीओसी डेमो के लिए काफी अच्छा काम करता है, और यह जानना अच्छा है कि एएस कार्यान्वयन विकल्प हैं जो अन्य प्रमुख परिदृश्यों का समर्थन करते हैं।

मैं एक डेमो कुंजी (उत्पादन के लिए उपयोग नहीं करते हैं) इस साइट का उपयोग उत्पन्न करने में सक्षम था: http://aspnetresources.com/tools/machineKey

और प्रत्येक अनुप्रयोग के web.config आईआईएस साइट में होस्ट में <system.web> तत्व के तहत परिणाम रखा । मुझे संसाधन सर्वर के स्टार्टअप क्लास में कुछ एएस-विशिष्ट कॉन्फ़िगरेशन विकल्पों को भी हटाना पड़ा।

उत्तर

7

वर्तमान में मिडलवेयर (या बल्कि उत्पादित टोकन) वास्तव में क्रॉस-एप्लिकेशन काम करने के लिए डिज़ाइन नहीं किया गया है। इन परिदृश्यों के लिए आपको वास्तविक प्रमाणीकरण सर्वर (उदा। https://github.com/thinktecture/Thinktecture.AuthorizationServer) का उपयोग करना चाहिए।

ने कहा कि आप दोनों अनुप्रयोगों में मशीन कुंजी (web.config में machineKey तत्व) को सिंक्रनाइज़ करके इसे काम करने के लिए प्राप्त कर सकते हैं। लेकिन मैंने कभी कोशिश नहीं की।

+1

+1 वेब सर्वर पर एक ही मशीन कुंजी का उपयोग करने के लिए, एकाधिक सर्वर पर समान पहुंच/बीयरर टोकन की अनुमति देने के लिए। आज मैंने सीखा "डिफ़ॉल्ट डेटा संरक्षण प्रदाता ... आईआईएस पर एएसपी.नेट मशीन कुंजी डेटा सुरक्षा का उपयोग करेगा" https://msdn.microsoft.com/en-us/library/microsoft.owin.security.oauth.oauthauthorizationserveroptions (v = vs.113) .aspx – Dunc

+0

मशीन कुंजी का उपयोग करने के लिए +1 नहीं है। सभी चीजें इस दोपहर से लड़ रहे थे और मशीन कुंजी मेरी समस्या को ठीक करने वाला नहीं है। बस अपना खुद का आईडीटाप्रोटेक्टर घुमाया और यह पता लगाने की कोशिश कर रहा है कि इसे श्रृंखला में कैसे प्राप्त किया जाए और मैं जो भी नमूना आती हूं, वह मशीन की कुंजी को प्यूक कर देती है जैसे कि यह पवित्र अंगूर है। लंगड़ा! –

0

एक कस्टम IDataProtector बनाने का प्रयास करें और अपने OAuthAuthorizationServerOptions को निम्न तरीके से कॉन्फ़िगर करें।

AuthorizationCodeFormat = new TicketDataFormat(new CustomDataProtector()), 
    RefreshTokenFormat = new TicketDataFormat(new CustomDataProtector()), 
    AccessTokenFormat = new TicketDataFormat(new CustomDataProtector()), 
3

डिफ़ॉल्ट रूप से, Owin ASP.NET मशीन की डाटा सुरक्षा का उपयोग OAuth पहुंच टोकन की रक्षा के लिए जब आईआईएस पर की मेजबानी की। आप टोकन को असुरक्षित करने के लिए System.Web.dll में MachineKey क्लास का उपयोग कर सकते हैं।

public class MachineKeyProtector : IDataProtector 
{ 
    private readonly string[] _purpose = 
    { 
     typeof(OAuthAuthorizationServerMiddleware).Namespace, 
     "Access_Token", 
     "v1" 
    }; 

    public byte[] Protect(byte[] userData) 
    { 
     throw new NotImplementedException(); 
    } 

    public byte[] Unprotect(byte[] protectedData) 
    { 
     return System.Web.Security.MachineKey.Unprotect(protectedData, _purpose); 
    } 
} 

फिर, AuthenticationTicket वस्तु जहां ClaimsIdentity और AuthenticationProperties प्राप्त कर सकते हैं पाने के लिए एक TicketDataFormat का निर्माण।

var access_token="your token here"; 
var secureDataFormat = new TicketDataFormat(new MachineKeyProtector()); 
AuthenticationTicket ticket = secureDataFormat.Unprotect(access_token); 

अन्य ओथ टोकन को असुरक्षित करने के लिए, आपको बस _purpose सामग्री को बदलने की आवश्यकता है। http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerMiddleware.cs

if (Options.AuthorizationCodeFormat == null) 
{ 
    IDataProtector dataProtecter = app.CreateDataProtector(
     typeof(OAuthAuthorizationServerMiddleware).FullName, 
     "Authentication_Code", "v1"); 

    Options.AuthorizationCodeFormat = new TicketDataFormat(dataProtecter); 
} 
if (Options.AccessTokenFormat == null) 
{ 
    IDataProtector dataProtecter = app.CreateDataProtector(
     typeof(OAuthAuthorizationServerMiddleware).Namespace, 
     "Access_Token", "v1"); 
    Options.AccessTokenFormat = new TicketDataFormat(dataProtecter); 
} 
if (Options.RefreshTokenFormat == null) 
{ 
    IDataProtector dataProtecter = app.CreateDataProtector(
     typeof(OAuthAuthorizationServerMiddleware).Namespace, 
     "Refresh_Token", "v1"); 
    Options.RefreshTokenFormat = new TicketDataFormat(dataProtecter); 
} 
1

जबकि जवाब वर्तमान में सूचीबद्ध काफी अच्छा कर रहे हैं, मैं कई बार निम्न का इस्तेमाल किया और बड़ी सफलता मिली है: विस्तृत जानकारी के लिए OAuthAuthorizationServerMiddleware वर्ग यहाँ देखें। Web.config में मशीन कुंजी सेट करना अच्छी तरह से काम करता है। सुनिश्चित करें कि आप अपनी खुद की जेनरेट करने के लिए माइक्रोसॉफ्ट साइट से पावरहेल का उपयोग करें!http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

संबंधित मुद्दे