- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我通过 loginRedirect
登录时,我可以看到重定向中填充了 MSAL token ,但在尝试使用该 token 时出现此错误:
Could not silently retrieve token from storage.
AADB2C90077: User does not have an existing session and request prompt parameter has a value of 'None'" directly after a successful login via Angular SPA app connected to Azure B2C.
我在 GitHub Issue 中发现了类似的东西, 然后评论 another issue在由于没有 token 而被迫执行 tokenPopup()
后出现错误之后:
"This application does not have sufficient permissions against this web resource to perform the operation"
他们可能没有关系,但他们都在阻止我
在此代码中,loginredirect
有效,我可以在本地存储中看到 token ,然后在下次使用 token 时,我收到控制台日志 authCallback-err
然后记录“无法从存储中静默检索 token ...”和首先提到的错误。
@Injectable()
export class MsalService {
private access_token: string;
private tenantConfig = {
tenant: environment.tenant,
clientID: environment.clientID,
signUpSignInPolicy: environment.signUpSignInPolicy,
b2cScopes: environment.b2cScopes
};
private authority = "https://login.microsoftonline.com/tfp/" +
this.tenantConfig.tenant +
"/" +
this.tenantConfig.signUpSignInPolicy;
private clientApplication: Msal.UserAgentApplication;
private authCallback(errorDesc: any, token: any, error: any, tokenType: any) {
var _this = this;
console.log("authCallback");
// For loginRedirect, tokenType = "id_token". For acquireTokenRedirect, tokenType:"access_token".
if (token) {
console.log("authCallback- Id token", token);
this.access_token = token;
} else {
console.log("authCallback-err : " + error + ":" + errorDesc);
alert("error here");
}
}
constructor() {
this.clientApplication = new Msal.UserAgentApplication(
this.tenantConfig.clientID,
this.authority,
this.authCallback,
{
cacheLocation: "localStorage",
redirectUri: "https://localhost:4200/msallogin"
}
);
}
get authenticated() {
const user = this.clientApplication.getUser();
if (user) {
return true;
}
return false;
}
public loginRedirect(): void {
this.clientApplication.loginRedirect(this.tenantConfig.b2cScopes);
}
public getAuthenticationToken(): Promise<string> {
return this.clientApplication
.acquireTokenSilent(this.tenantConfig.b2cScopes)
.then(token => {
console.log("Got silent access token: ", token);
return token;
})
.catch(error => {
console.log("Could not silently retrieve token from storage.", error);
return this.clientApplication
.acquireTokenPopup(this.tenantConfig.b2cScopes)
.then(token => {
console.log("Got popup access token: ", token);
return token;
})
.catch(error => {
console.log("Could not retrieve token from popup.", error);
this.clientApplication.acquireTokenRedirect(
this.tenantConfig.b2cScopes
);
return Promise.resolve("");
});
});
}
public login(): void {
var _this = this;
this.clientApplication.loginPopup(this.tenantConfig.b2cScopes).then(
function(idToken: any) {
_this.clientApplication
.acquireTokenSilent(_this.tenantConfig.b2cScopes)
.then(
function(accessToken: any) {
_this.access_token = accessToken;
console.log("ACCESS TOKEN: \n " + _this.access_token);
},
function(error: any) {
_this.clientApplication
.acquireTokenPopup(_this.tenantConfig.b2cScopes)
.then(
function(accessToken: any) {
_this.access_token = accessToken;
},
function(error: any) {
alert("Error acquiring the popup:\n" + error);
}
);
}
);
},
function(error: any) {
alert("Error during login:\n" + error);
}
);
}
logout(): void {
this.clientApplication.logout();
}
isOnline(): boolean {
return this.clientApplication.getUser() != null;
}
public getUser(): string {
const user = this.clientApplication.getUser();
if (!user) {
return null;
}
return user.name;
}
}
然后,一旦我登录,重定向就会返回,我会重定向到另一条 angular 路由。该组件已注入(inject) MSAL 服务。
此时,我调用 getUser()
并可以看到我的用户名。然后我点击一个按钮发出一个网络请求,发出下一段代码作为拦截器,但是因为没有 token 而失败
@可注入(inject)()导出类 MSALAuthenticationHttpInterceptor 实现 HttpInterceptor { 构造函数(私有(private) msalService:MsalService){}
@intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return Observable.fromPromise(
this.msalService.getAuthenticationToken()
).switchMap(token => {
req = req.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(req);
});
}
}
我的 B2C 用作连接到 Azure 函数的 postman 应用程序,它绝对是 B2C 配置、我的代码或 MSAL。 If it is我无法从 B2C 策略 Blade 修改这些设置,所以不确定他是如何解决的。
B2c 配置列在 1 的注释中我在这上面花了很多时间,这可能很容易,但是由于跨各种应用程序的多个范围以及不同的问题和范围 Blade 的变化,它似乎比应该的更难
使用:
Angular: "5.2.0"
MSAL: "^0.1.5"
最佳答案
我有同样的错误。
我所做的是在登录策略的 XML 文件中添加 2 行,这解决了我的问题。
<UserJourneyBehaviors>
<SessionExpiryType>Absolute</SessionExpiryType>
<SessionExpiryInSeconds>86400</SessionExpiryInSeconds>
</UserJourneyBehaviors>
希望对您有所帮助。 :)
关于typescript - b2c msal 用户没有现有的 session 和请求提示参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49424692/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!