سؤال

أحاول تنفيذ OAuth باستخدام OWIN لنقطة نهاية Web API v2 على الإنترانت المحلية الخاصة بي.تتم استضافة واجهة برمجة التطبيقات (API) في IIS باستخدام مصادقة Windows المضمنة.باختصار، هذا ما أريد أن يحدث.

عندما أطلب الرمز المميز الخاص بي على /token

  1. سحب WindowsPrincipal خارج سياق OWIN

  2. استخدم SID من WindowsPrincipal للبحث عن بعض الأدوار لهذا المستخدم في جدول SQL.

  3. قم بإنشاء ClaimsIdentity جديد يقوم بتخزين اسم المستخدم والأدوار

  4. قم بتحويل ذلك إلى Json Web Token (JWT) الذي أرسلته إلى bak

عندما أطلب موردًا من واجهة برمجة التطبيقات (API) الخاصة بي باستخدام الرمز المميز الخاص بي

  1. قم بتحويل رمز JWT Bearer المميز مرة أخرى إلى ClaimsIdentity

  2. استخدم هذا الادعاء لتوضيح طلبات المورد بالدور

  3. وبهذه الطريقة ، لا يتعين علي البحث عن قاعدة بيانات لأدوار المستخدم في كل طلب.لقد تم خبزه للتو في JWT.

أعتقد أنني أقوم بإعداد كل شيء بشكل صحيح.تبدو طريقة Startup.Configuration الخاصة بي هكذا.

public void Configuration(IAppBuilder app)
{

    // token generation
    // This is what drives the action when a client connects to the /token route
    app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
    {
        // for demo purposes
        AllowInsecureHttp = true,

        TokenEndpointPath = new PathString("/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
        AccessTokenFormat = GetMyJwtTokenFormat(),
        Provider = new MyAuthorizationServerProvider()
    });



    //// token consumption
    app.UseOAuthBearerAuthentication(
        new OAuthBearerAuthenticationOptions()
        {
            Realm = "http://www.ccl.org",
            Provider = new OAuthBearerAuthenticationProvider(),
            AccessTokenFormat = GetMyJwtTokenFormat()
        }
    );


    app.UseWebApi(WebApiConfig.Register());

}

يبدو MyAuthorizationServerProvider مثل هذا ...

    public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {

            // Since I'm hosting in IIS with Windows Auth enabled
            // I'm expecting my WindowsPrincipal to be here, but it's null  :(
            var windowsPrincipal = context.OwinContext.Request.User.Identity;

            // windowsPrincipal is null here.  Why?

            // Call SQL to get roles for this user

            // create the identity with the roles
            var id = new ClaimsIdentity(stuff, more stuff);

            context.Validated(id);
        }
    }

مشكلتي هي أن context.Request.User فارغ هنا.لا أستطيع الوصول إلى WindowsPrincipal الخاص بي.إذا قمت بإنشاء بعض البرامج الوسيطة الوهمية الأخرى، فيمكنني الوصول إلى WindowsPrincipal دون مشكلة.لماذا هو فارغ في هذا السياق؟أفعل شيئا خاطئا؟

هل كانت مفيدة؟

المحلول

قم بتبديل ترتيب UseOAuthAuthorizationServer وUseOAuthBearerAuthentication.مكالمات UseOAuthBearerAuthentication UseStageMarker(PipelineStage.Authenticate); لتشغيله (وكل شيء قبله) مسبقًا في مسار ASP.NET.المستخدم فارغ عند التشغيل أثناء مرحلة المصادقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top