c# – Owin承载令牌不适用于WebApi
发布时间:2020-12-15 07:48:34 所属栏目:百科 来源:网络整理
导读:我已经经历了大量的文档,我的谷歌搜索显示我已经访问了第一页上的所有链接 问题 令牌代工作正常.我使用自定义提供程序配置它: public void ConfigureOAuth(IAppBuilder app) { var usermanager = NinjectContainer.ResolveUserManager(); app.USEOAuthAutho
我已经经历了大量的文档,我的谷歌搜索显示我已经访问了第一页上的所有链接
问题 public void ConfigureOAuth(IAppBuilder app) { var usermanager = NinjectContainer.Resolve<UserManager>(); app.USEOAuthAuthorizationServer(new OAuthAuthorizationServerOptions { AllowInsecureHttp = true,TokenEndpointPath = new PathString("/token"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),Provider = new AppOAuthProvider(usermanager) }); app.USEOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); } 但是当我调用受保护的URL并传递承载令牌时,我总是得到: 如何诊断或解决问题.如果可能,我该如何进行令牌验证 UPDATE public class AppOAuthProvider : OAuthAuthorizationServerProvider { private UserManager _user; public AppOAuthProvider(UserManager user) { _user = user; } public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) { context.Validated(); } public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin",new[] { "*" }); //Get User Information var getUser = _user.FindUser(context.UserName); if (getUser.Status == StatusCode.Failed) { context.SetError("invalid_grant","The user name or password is incorrect."); return Task.FromResult<object>(null); } var user = getUser.Result; //Get Roles for User var getRoles = _user.GetRoles(user.UserID); if (getRoles.Status == StatusCode.Failed) { context.SetError("invalid_grant","Could not determine Roles for the Specified User"); } var roles = getRoles.Result; var identity = new ClaimsIdentity(context.Options.AuthenticationType); identity.AddClaim(new Claim("UserID",user.UserID.ToString())); identity.AddClaim(new Claim("UserName",user.UserName)); foreach (var role in roles) { identity.AddClaim(new Claim(ClaimTypes.Role,role)); } context.Validated(identity); return Task.FromResult<object>(null); } } 更新2: [RoutePrefix("api/auth/account")] public class AccountController : ApiController { private UserManager _user; public AccountController(UserManager user) { _user = user; } [Authorize] [HttpGet] [Route("secret")] public IHttpActionResult Secret() { return Ok("Yay! Achievement Unlocked"); } } 更新3: public partial class Startup { public void Configuration(IAppBuilder app) { app.UseNinjectMiddleware(NinjectContainer.CreateKernel); app.UseNinjectWebApi(GlobalConfiguration.Configuration); GlobalConfiguration.Configure(WebApiConfig.Register); ConfigureOAuth(app); app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); app.UseWebApi(GlobalConfiguration.Configuration); app.UseWelcomePage(); } } 解决方法
在IAppBuilder上调用UseWebApi之前,必须先配置OAuth授权服务器和OAuth承载认证.以下是我的程序.
public void Configuration(IAppBuilder app) { app.UseFileServer(new FileServerOptions() { RequestPath = PathString.Empty,FileSystem = new PhysicalFileSystem(@".files") }); // set the default page app.UseWelcomePage(@"/index.html"); ConfigureAuth(app); HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute ( name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional } ); config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; app.UseCors(CorsOptions.AllowAll); app.UseWebApi(config); } public void ConfigureAuth(IAppBuilder app) { OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions() { AllowInsecureHttp = true,Provider = new YourApplicationOAuthProvider() }; app.USEOAuthAuthorizationServer(oAuthServerOptions); app.USEOAuthBearerAuthentication ( new OAuthBearerAuthenticationOptions { Provider = new OAuthBearerAuthenticationProvider() } ); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |