context.Request.User فارغ في OWIN OAuthAuthorizationServerProvider
-
21-12-2019 - |
سؤال
أحاول تنفيذ OAuth باستخدام OWIN لنقطة نهاية Web API v2 على الإنترانت المحلية الخاصة بي.تتم استضافة واجهة برمجة التطبيقات (API) في IIS باستخدام مصادقة Windows المضمنة.باختصار، هذا ما أريد أن يحدث.
عندما أطلب الرمز المميز الخاص بي على /token
سحب WindowsPrincipal خارج سياق OWIN
استخدم SID من WindowsPrincipal للبحث عن بعض الأدوار لهذا المستخدم في جدول SQL.
قم بإنشاء ClaimsIdentity جديد يقوم بتخزين اسم المستخدم والأدوار
قم بتحويل ذلك إلى Json Web Token (JWT) الذي أرسلته إلى bak
عندما أطلب موردًا من واجهة برمجة التطبيقات (API) الخاصة بي باستخدام الرمز المميز الخاص بي
قم بتحويل رمز JWT Bearer المميز مرة أخرى إلى ClaimsIdentity
استخدم هذا الادعاء لتوضيح طلبات المورد بالدور
وبهذه الطريقة ، لا يتعين علي البحث عن قاعدة بيانات لأدوار المستخدم في كل طلب.لقد تم خبزه للتو في 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.المستخدم فارغ عند التشغيل أثناء مرحلة المصادقة.